Python 矢量化数组:在指定位置用1构造矩阵,在其他位置用0构造矩阵
我有一个长度为L的(一维)numpy数组,数组中填充了从0到N-1的数字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)中的(
现在,我想构造一个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