Numpy:将索引到"bump"数组的高效数组



给定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]])

最新更新