NumPy中的加权计数

4
在numpy中有没有方法可以对以下操作进行向量化处理?
a = np.zeros(3)
idx = np.array([1, 0, 1])
val = np.array([1, 2, 3])
for i, v in zip(idx, val):
    a[i] += v
# a = [2, 4, 0]

下面的代码不能像期望的那样正常工作。
a = np.zeros(3)
idx = np.array([1, 0, 1])
val = np.array([1, 2, 3])
a[idx] += val
# wrong answer: a = [2, 3, 0]

问题肯定在于重复索引,但我有点惊讶它无法做到显而易见的事情。 - orlp
是的,在实践中很容易被忽视。 - Maybe
1个回答

4
我们可以使用np.bincount函数,将val参数作为权重进行设置:
np.bincount(idx, weights=val, minlength=len(idx)).astype(int)
#array([2, 4, 0])

实际上这正是问题中所分享的内容。通过给np.bincount添加weight参数,而不是:

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) - Jan Christoph Terasa
如果我理解正确,bincount的结果是'a',你只需要将其设置为您正在迭代的值的长度(在“zip”中的可迭代对象)@quang - yatu
你不想获得 a 吗?这个问题似乎有点令人困惑,因为你从“是否有任何方法在numpy中矢量化以下操作?”开始,其中硬编码了 idxval,并计算了 a。@maybe - yatu
这个问题似乎有两个方面,首先你正在询问如何将某些东西向量化(这在这里已经得到了回答),然后在“实际上,我想要获得所需的…”之后,你提出了一个不同的问题@maybe。 - yatu
是的,实际上第一部分就是我想要问的。但后来我意识到这还不够...也许我得问另一个问题。 - Maybe
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接