简单版本:如果我这样做:
import numpy as np
a = np.zeros(2)
a[[1, 1]] += np.array([1, 1])
I get [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)
Output:
[ 0. 0. 0.61927097 0.02592623 0.29965467]
[ 0. 0. 1.05459336 0.02592623 1.27063303]
我认为这里发生的事情是如果a[a.cond].ix
保证是唯一的,我的方法会很好地工作,如简单示例中所述。