繁体   English   中英

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

[英]Apply bincount to each row of a 2D numpy array

有没有办法用“轴= 1”应用bincount 期望的结果与列表理解相同:

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

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)

如果数据太大而不能使其高效,那么问题更可能是密集矩阵的内存使用而不是数值运算本身。 下面是一个在矩阵上使用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

你可以使用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)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM