向量化数组:构造矩阵,在指定位置为 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,其中填充了从 0 到 N-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 [重复]的主要内容,如果未能解决你的问题,请参考以下文章