向量化数组:构造矩阵,在指定位置为 1,在其他位置为 0 [重复]

Posted

技术标签:

【中文标题】向量化数组:构造矩阵,在指定位置为 1,在其他位置为 0 [重复]【英文标题】:vectorize array: construct matrix with 1 in specified places and 0 elsewhere [duplicate] 【发布时间】:2020-01-10 02:56:44 【问题描述】:

我有一个长度为 L 的(一维)numpy 数组 a,其中填充了从 0N-1 的数字。 现在,我想构建一个 NxL 矩阵,使得在每一列 c 中,a[c]第 1 个条目为 1,所有其他条目为 0。

例如,如果 L=4,N=5 并且

a = np.array([1,2,0,4])

那么我们需要一个矩阵

m = np.array([[0,0,1,0],
              [1,0,0,0],
              [0,1,0,0],
              [0,0,0,0],
              [0,0,0,1]])

现在,我有以下代码:

def vectorize(a, L, N):
    m = np.zeros((N, L))
    for (i,x) in enumerate(a):
        m[x][i] = 1.0

    return m

这很好用,但我确信有一个更快的方法使用一些 numpy 技巧(避免循环 a)。

【问题讨论】:

第二个链接副本是一个很好的单热编码资源,我认为np.eye(a.max()+1)[a] 是一种干净的方法 【参考方案1】:

当您使用整数数组作为索引时,您需要广播到相同形状的其他数组来指示在其他维度中的位置。在您的情况下,a 的每个元素都是一个行索引。对应的列是:

b = np.arange(L)

现在您可以直接索引到矩阵m

m = np.zeros((N, L), dtype=bool)
m[a, b] = True

当你索引一个 numpy 数组时,你应该使用单个括号运算符中的所有索引,而不是像 m[a][b] 这样的单独的运算符。当a 是整数数组时,m[a]m 部分的副本,但是当a 是单个整数时,原始数据的视图,这是您的示例有效的唯一原因。

【讨论】:

【参考方案2】:

您可以将np.arange(..) 用于第二个轴:

def vectorize(a, L, N):
    m = np.zeros((N, L), int)
    m[a, np.arange(len(a))] = 1
    return m

所以对于给定的样本输入,我们得到:

>>> a = np.array([1,2,0,4])
>>> vectorize(a, 4, 5)
array([[0, 0, 1, 0],
       [1, 0, 0, 0],
       [0, 1, 0, 0],
       [0, 0, 0, 0],
       [0, 0, 0, 1]])

【讨论】:

【参考方案3】:
def vectorize(a, L, N):
    m = np.zeros((N, L))
    m[a,np.arange(L)] =1
    return m

【讨论】:

以上是关于向量化数组:构造矩阵,在指定位置为 1,在其他位置为 0 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

向量化涉及短裤的条件

js向数组指定位置插入一个对象

D. Nash Matrix

JS基础用法-向数组指定位置插入对象

[自然语言处理] 文本向量化技术

noi.ac #529 神树的矩阵