有没有办法将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]])
答案 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