给定0 ... k-1
索引数组的长度n
(即 A = [0, 0, 1, 2, 1, ...]
(,形成新的形状(n, k)
B
数组的最有效方法是什么,这样B[i,j] = 1
如果A[i] == j
,否则A[i] = 0
?
即,对于示例A = [0, 0, 1, 2, 1, ...]
(k=3)
,我们将得到
B = [[1, 0, 0], [1, 0, 0], [0, 1, 0], [0, 0, 1], [0, 1, 0], ...]
有没有办法在没有显式 for 循环的情况下做到这一点?
考虑到您构建的数组的稀疏性,您可能希望使用 Scipy 的稀疏矩阵,它具有内存占用较小的优点:
import numpy
from scipy import sparse
A = numpy.array([0, 0, 1, 2, 1])
k = 3
B = sparse.coo_matrix((numpy.full(len(A), 1, dtype=int), (numpy.arange(len(A)), A)), shape=(len(A), k))
(coo_matrix()
在 Scipy 的文档中进行了描述(。这给出了预期的结果:
>>> B.todense()
matrix([[ 1., 0., 0.],
[ 1., 0., 0.],
[ 0., 1., 0.],
[ 0., 0., 1.],
[ 0., 1., 0.]])
但内存占用量很小(如果k
足够大[大于几个单位](。为了节省更多内存,上面的dtype
可以做得更小(取决于您的确切需求(,dtype=numpy.int8
甚至dtype=bool
。
import numpy as np
A = np.array([0, 0, 1, 2, 1])
B = np.zeros((len(A), 3), dtype=np.int)
B[np.arange(len(A)), A] = 1
结果:
>>> B
array([[1, 0, 0],
[1, 0, 0],
[0, 1, 0],
[0, 0, 1],
[0, 1, 0]])
A=np.array([0, 0, 1, 2, 1])
n=5
k=3
B=np.zeros(n*k, 'int')
B[np.arange(n)*k+A]=1
B.reshape((n,k))
结果:
array([[ 1, 0, 0],
[ 1, 0, 0],
[ 0, 1, 0],
[ 0, 0, 1],
[ 0, 1, 0]])