Python 矢量化数组:在指定位置用1构造矩阵,在其他位置用0构造矩阵

Python 矢量化数组:在指定位置用1构造矩阵,在其他位置用0构造矩阵,python,arrays,numpy,matrix,vectorization,Python,Arrays,Numpy,Matrix,Vectorization,我有一个长度为L的(一维)numpy数组,数组中填充了从0到N-1的数字 现在,我想构造一个NxL矩阵,这样在每列c中,a[c]的第个条目是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矢量化(a、L、N): m=np.零((N,L)) 对于枚举(a)中的(

我有一个长度为L的(一维)numpy数组,数组中填充了从0N-1的数字
现在,我想构造一个NxL矩阵,这样在每列c中,a[c]的第个条目是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矢量化(a、L、N): m=np.零((N,L)) 对于枚举(a)中的(i,x): m[x][i]=1.0 返回m
这很好,但我确信有一种更快的方法使用一些numpy技巧(避免在a上循环)。

您可以在第二个轴上使用
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]])

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

b = np.arange(L)
现在您可以直接索引到矩阵
m

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

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

我认为
np.eye(a.max()+1)[a]
是一种干净的方法
def vectorize(a, L, N):
    m = np.zeros((N, L))
    m[a,np.arange(L)] =1
    return m