[英]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.