我想找到另一维一维numpy数组(arr1
)中给定一维numpy数组(arr2
)的元素的频率。数组arr1
包含没有重复的元素。另外,arr1
中的所有元素都是arr2
以这个为例,
arr1 = np.array([1,2,6])
arr2 = np.array([2, 3, 6, 1, 2, 1, 2, 0, 2, 0])
目前,我正在使用以下内容:
freq = np.zeros( len(arr1) )
for i in range( len(arr1) ):
mark = np.where( arr2==arr1[i] )
freq[i] = len(mark[0])
print freq
>>[2, 4, 1]
上述方法给了我正确答案。但是,我想知道是否有一种比我正在遵循的方法更好/更有效的方法。
答案 0 :(得分:4)
这是基于np.searchsorted
的矢量化解决方案-
idx = np.searchsorted(arr1,arr2)
idx[idx==len(arr1)] = 0
mask = arr1[idx]==arr2
out = np.bincount(idx[mask])
假定arr1
已排序。如果不是这样,我们有两种解决方案:
将arr1
排序为预处理步骤。由于arr1
是arr2
中唯一元素的一部分,因此它应该是一个相对较小的数组,因此是一种廉价的排序操作。
使用sorter
的arg和searchsorted
来计算idx
:
sidx = arr1.argsort()
;
idx = sidx[np.searchsorted(arr1,arr2,sorter=sidx)]