矢量化数组:在指定位置用1和0构造矩阵

2024-06-12 08:55:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个长度L的(一维)numpy数组,数组中填充了从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技巧(避免在一个页面上循环)。你知道吗


Tags: 代码innumpyfordefnpzeros条目
3条回答

可以对第二个轴使用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]])
def vectorize(a, L, N):
    m = np.zeros((N, L))
    m[a,np.arange(L)] =1
    return m

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

b = np.arange(L)

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

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

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

相关问题 更多 >