如何在相同形状的数组之间计数?



在计算0-1图像2d-entropy时,我需要得到邻域灰度概率分布:


img=np.random.randint(0,2,(64,64))
avg=avgpool2d(img,kernel_size=3,padding=1).numpy() * 9
avg = avg.astype(np.int32)
distribution=np.zeros((2,9))
for i,j in zip(img.flat,avg.flat):
distribution[i,j]+=1

我想使用numpy的方式来避免循环,但是花哨的索引在这里似乎不起作用:

a=np.zeros((3,))
b=np.array([1,0,0])
a[b]+=1 # a=[1,1,0] not [2,1,0]

img=np.random.randint(0,2,(64,64))
avg=avgpool2d(img,kernel_size=3,padding=1).numpy() * 9
avg = avg.astype(np.int32)
distribution=np.zeros((2,9))
distribution[img,avg]+=1

给出错误的结果

是否有一种优雅的方法在两个(或更多)数组之间计数?

更广泛地说,我如何计算出现N-tuple (a1,…,an)的次数,其中a1,…,在不同的数组X1,…中具有相同的索引idx。

使用numpy.unique:

a=np.zeros((3,))
b=np.array([1,0,0])
idx, cnt = np.unique(b, return_counts=True)
a[idx] += cnt

numpy.add.at(in place):

np.add.at(a, b, 1)

输出:

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

直接使用numpy.unique

import numpy as np

a = np.array([1,       0, 0, 1,])
b = np.array([2 ** 10, 0, 0, 0,])

def count_fun(*args):
co = np.stack(args,axis=-1)
print('con',co)
element, count = np.unique(co, return_counts=True, axis=0)
print('elementn',element)
print('countn',count)
return element, count
count_fun(a,b)

出局:

co
[[   1 1024]
[   0    0]
[   0    0]
[   1    0]]
element
[[   0    0]
[   1    0]
[   1 1024]]
count
[2 1 1]