Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用索引数组将一个数组累加到另一个数组中_Python_Arrays_Numpy - Fatal编程技术网

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

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如果你扭

我的问题是关于我想用numpy表示的特定数组操作

我有一个浮点数组
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,但我不知道它可以处理权重!太棒了:)在这一天剩下的时间里,请随意感受我的英雄形象:)