将bincount应用于2D numpy数组的每一行

时间:2016-01-12 22:48:31

标签: python numpy

有没有办法将bincount应用于" axis = 1"?期望的结果与列表理解相同:

import numpy as np
A = np.array([[1,0],[0,0]])
np.array([np.bincount(r,minlength = np.max(A) + 1) for r in A])

#array([[1,1]
#       [2,0]])

3 个答案:

答案 0 :(得分:3)

np.bincount不能沿某个轴使用2D数组。为了通过对np.bincount的单个矢量化调用获得所需的效果,可以创建一维ID数组,这样即使元素相同,不同的行也会有不同的ID。当使用带有这些ID的np.bincount单个调用时,这将使来自不同行的元素不会合并在一起。因此,可以创建这样的ID数组,并考虑linear indexing的想法,如此 -

N = A.max()+1
id = A + (N*np.arange(A.shape[0]))[:,None]

然后,将ID提供给np.bincount,最后重塑为2D -

np.bincount(id.ravel(),minlength=N*A.shape[0]).reshape(-1,N)

答案 1 :(得分:1)

如果数据太大而无法提高效率,那么问题更可能是密集矩阵的内存使用,而不是自身的数值运算。下面是一个在矩阵上使用sklearn Hashing Vectorizer的示例,该矩阵太大而无法使用bincounts方法(结果是稀疏矩阵):

import numpy as np
from sklearn.feature_extraction.text import HashingVectorizer
h = HashingVectorizer()
A = np.random.randint(100,size=(1000,100))*10000
A_str = [" ".join([str(v) for v in i]) for i in A]

%timeit h.fit_transform(A_str)
#10 loops, best of 3: 110 ms per loop

答案 2 :(得分:0)

您可以使用apply_along_axis,这是一个示例

import numpy as np
test_array = np.array([[0, 0, 1], [0, 0, 1]])
print(test_array)
np.apply_along_axis(np.bincount, axis=1, arr= test_array,
                                          minlength = np.max(test_array) +1)

请注意,此数组的最终形状取决于容器的数量,您还可以指定其他参数以及apply_along_axis