Numpy使用索引数组将一个数组累加到另一个数组中

11
我的问题是关于一个特定的数组操作,我想用numpy表达它。 我有一个包含浮点数的数组和一个与长度相同的索引数组,我想将所有具有相同值的求和,并将它们收集到一个数组中。作为循环,它看起来像这样:
for i, x in enumerate(w):
     v[idx[i]] += x
有没有使用数组操作的方法来做这件事? 我的猜测是 v[idx] += w,但这并不起作用,因为 idx 包含多个相同的索引。
谢谢!

“原子性”确实不是你想要做的事情的恰当描述。 - Constantinius
你会如何描述它?希望新的标题更好。 - Andreas Mueller
1
@Constantinius,他对自己提出的所有问题都接受了一个答案,只有一个问题只得到了一个回复,虽然这个回复很好,但并没有解决他实际的问题。也许应该努力不去强调这个网站的游戏性质。 - Mike Graham
@MikeGraham 我接受了一些很好的答案作为对他评论的回应。 - Andreas Mueller
@nye17 是的,没错。这个循环是我代码中的主要瓶颈之一。而且我遇到过这个问题几次,从未找到一个好的解决方案。 - Andreas Mueller
显示剩余4条评论
2个回答

15

numpy.bincount是为了这个目的而引入的:

tmp = np.bincount(idx, w)
v[:len(tmp)] += tmp

我认为从1.6版本开始,你也可以向bincount传递一个minlength参数。


我知道bincount,但我不知道它可以处理权重!太棒了 :) - Andreas Mueller
今天的剩余时间里,请随意把我当做你的英雄 :) - Andreas Mueller

4

这是一个已知的行为,尽管有些不幸,但在numpy级别上并没有解决办法。(bincount可以用于此目的,如果你适当使用的话。)自己循环是最好的选择。

请注意,如果不重新使用名称w并且不引入另一组索引,您的代码可能会更加清晰,例如:

for i, w_thing in zip(idx, w):
    v[i] += w_thing

如果您需要加快此循环速度,可能需要降级到C语言。使用Cython可以使这个过程相对容易。


更简单地说:for i in idx: v[i] += w[i] - Fred Foo
没有索引,这个应该可以工作,对吧? 你发布的代码只是简单地执行“v + w”,对吧?(如果“v”比“w”长,那么只使用前“len(w)”个元素。) 重用“w”是一个相当糟糕的打字错误,抱歉。 - Andreas Mueller
@AndreasMueller,抱歉,我打错了字。 - Mike Graham
@larsmans,我的代码片段中有一个错别字,我已经修复了。那段代码与OP的代码不是做同样的事情。 - Mike Graham

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