将多个值添加到一个numpy数组索引

Mat*_*att 5 python arrays numpy

简单版本: 如果我这样做:

import numpy as np
a = np.zeros(2)
a[[1, 1]] += np.array([1, 1])
Run Code Online (Sandbox Code Playgroud)

我得到[0, 1]了输出.但我想[0, 2].这可能是某种方式,使用隐式numpy循环而不是自己循环它?

什么 - 我实际需要做的版本:

我有一个结构化数组,包含索引,值和一些布尔值.我想基于布尔值在那些索引处对这些值求和.很明显,这可以通过一个简单的循环来完成,但似乎应该可以使用聪明的numpy索引(如上所述).

例如,我有一个包含5个元素的数组,我想从数组中填充值,索引和条件:

import numpy as np
size = 5
nvalues = 10
np.random.seed(1)
a = np.zeros(nvalues, dtype=[('val', float), ('ix', int), ('cond', bool)])
a = np.rec.array(a)
a.val = np.random.rand(nvalues)
a.cond = (np.random.rand(nvalues) > 0.3)
a.ix = np.random.randint(size, size=nvalues)

# obvious solution
obvssum = np.zeros(size)
for i in a:
    if i.cond:
        obvssum[i.ix] += i.val

# is something this possible?
doesntwork = np.zeros(size)
doesntwork[a[a.cond].ix] += a[a.cond].val

print(doesntwork)
print(obvssum)
Run Code Online (Sandbox Code Playgroud)

输出:

[ 0.          0.          0.61927097  0.02592623  0.29965467]
[ 0.          0.          1.05459336  0.02592623  1.27063303]
Run Code Online (Sandbox Code Playgroud)

我认为这里发生的事情是如果a[a.cond].ix保证是唯一的,我的方法会很好,如简单示例中所述.

use*_*ica 7

这就是atNumPy ufuncs 的方法:

output = numpy.zeros(size)
numpy.add.at(output, a[a.cond].ix, a[a.cond].val)
Run Code Online (Sandbox Code Playgroud)