Python 以NumPy为单位的加权计数

Python 以NumPy为单位的加权计数,python,arrays,numpy,Python,Arrays,Numpy,在numpy中是否有任何方法可以矢量化以下操作 a=np.零(3) idx=np.array([1,0,1]) val=np.array([1,2,3]) 对于zip中的i,v(idx,val): a[i]+=v #a=[2,4,0] 以下代码无法按预期工作 a=np.零(3) idx=np.array([1,0,1]) val=np.array([1,2,3]) a[idx]+=val #错误答案:a=[2,3,0] 我们可以使用设置val作为权重: np.bincount(idx, wei

在numpy中是否有任何方法可以矢量化以下操作

a=np.零(3)
idx=np.array([1,0,1])
val=np.array([1,2,3])
对于zip中的i,v(idx,val):
a[i]+=v
#a=[2,4,0]
以下代码无法按预期工作

a=np.零(3)
idx=np.array([1,0,1])
val=np.array([1,2,3])
a[idx]+=val
#错误答案:a=[2,3,0]
我们可以使用设置
val
作为权重:

np.bincount(idx, weights=val, minlength=len(idx)).astype(int)
#array([2, 4, 0])

事实上,这正是问题中的共同点。通过将
重量
添加到
np.bincount
,而不是:

np.bincount(idx, minlength=len(idx)) 
# array([1, 2, 0], dtype=int64)
这与获取计数相同:

for i in idx:
    a[i] += 1

print(a)
# array([1., 2., 0.])
我们有一个
out[n]+=weight[i]

for i, v in zip(idx, val):
    a[i] += v

print(a)
# array([2., 4., 0.])

问题当然存在于重复索引中,但我有点惊讶地发现这并没有达到明显的效果。是的,它在实践中很容易被忽略。如果你想保留整数,请添加
。astype(int)
。你的意思是
meanlength=len(a)
?True@jan返回的值是带权重的浮点值。bincount的结果是
a
IIUC,您只需将其设置为迭代的值的长度(zip中的iterables)@quangHi,@yatu感谢您的回答。当我添加到问题中时,您能想出一种方法来优雅地获得所需的
idx
val
吗?