2017-02-01 51 views
2

简单的版本: 如果我这样做:多个值添加到一个numpy的数组索引

import numpy as np 
a = np.zeros(2) 
a[[1, 1]] += np.array([1, 1]) 

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

什么-I-实际上,需要对DO版本A:

我有一个包含一个索引,一个值,有的布尔值的结构化阵列。我想根据布尔值在那些指数上对这些值进行求和。很明显,这可以通过一个简单的循环来完成,但似乎应该可以使用巧妙的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) 

输出:

[ 0.   0.   0.61927097 0.02592623 0.29965467] 
[ 0.   0.   1.05459336 0.02592623 1.27063303] 

我觉得发生了什么这里是如果a[a.cond].ix保证是唯一的,我的方法将工作得很好,如简单示例中所述。

回答

5

这是NumPy的ufuncs的at方法是:

output = numpy.zeros(size) 
numpy.add.at(output, a[a.cond].ix, a[a.cond].val) 
相关问题