Python 使用索引数组将一个数组累加到另一个数组中
我的问题是关于我想用numpy表示的特定数组操作 我有一个浮点数组Python 使用索引数组将一个数组累加到另一个数组中,python,arrays,numpy,Python,Arrays,Numpy,我的问题是关于我想用numpy表示的特定数组操作 我有一个浮点数组w和一个与w长度相同的索引数组idx,我想用相同的idx值汇总所有w,并将它们收集到一个数组v。 作为一个循环,如下所示: for i, x in enumerate(w): v[idx[i]] += x 有没有一种方法可以通过数组操作实现这一点? 我的猜测是v[idx]+=w,但这不起作用,因为idx多次包含相同的索引 谢谢 这是一种已知的行为,尽管有点不幸,但没有numpy级别的解决方法。(bincount如果你扭
w
和一个与w
长度相同的索引数组idx
,我想用相同的idx
值汇总所有w
,并将它们收集到一个数组v
。
作为一个循环,如下所示:
for i, x in enumerate(w):
v[idx[i]] += x
有没有一种方法可以通过数组操作实现这一点?
我的猜测是v[idx]+=w
,但这不起作用,因为idx
多次包含相同的索引
谢谢 这是一种已知的行为,尽管有点不幸,但没有numpy级别的解决方法。(
bincount
如果你扭动它的手臂,可以用于此。)自己做循环确实是你最好的选择
请注意,如果不重新使用名称w
,也不引入另一组索引(如
for i, w_thing in zip(idx, w):
v[i] += w_thing
如果您需要加速此循环,可能必须降到C。Cython使此操作相对容易。
numpy.bincount
就是为此而引入的:
tmp = np.bincount(idx, w)
v[:len(tmp)] += tmp
我认为从1.6开始,您还可以将minlength传递给
bincount
,而atomic对于您想要做的事情来说确实是一个不合适的描述。您如何描述它?“希望新的头衔更好!”康斯坦丁尼乌斯,除了一个问题外,他接受了所有问题的答案,但有一个回答虽然很好,但并没有解决他的实际问题。也许你应该努力避免引起人们对这个网站游戏方面的注意。我更喜欢这个新的描述。原子在多线程编程环境中经常被提及,因此问题标题具有误导性。@MikeGraham我接受了一些不错的答案作为对他的评论的回应。更简单的是:对于idx中的I:v[I]+=w[I]
。如果没有索引,这应该可以工作,对吗?你发布的代码只是v+w
,对吗?(如果v
比w
长,则仅第一个len(w)
元素被使用。重复使用w
是一个非常糟糕的输入错误,对不起。@AndreasMueller,对不起,我有一个输入错误。@larsmans,我的代码片段中有一个我已经修复的输入错误。该代码与OP的代码不一样。我知道bincount,但我不知道它可以处理权重!太棒了:)在这一天剩下的时间里,请随意感受我的英雄形象:)