我想在两个numpy数组上应用plus运算符。但是,有一个收缩。 我只想在第一个数组中它不为零时总结该元素。我可以循环执行此操作,但这非常慢。是否有一种典型的方法?
if a1[xyz] != 0:
r[xyz] = a1[xyz] + a2[xyz]
答案 0 :(得分:3)
使用面具:
mask = a1 != 0
r[mask] = a1[mask] + a2[mask]
这假设r, a1, a2
具有相同的形状。
答案 1 :(得分:2)
另一种快速方式:np.where(a1==0,r,a1+a2)
。
答案 2 :(得分:0)
正如我在Optimize a function that acts on a numpy array with an if statement中所提到的,许多ufunc
采用where
参数
在这种情况下,我们可以这样使用np.add
:
In [168]: r = np.arange(10)
In [169]: a1 = np.ones(10,int); a1[3:7]=0
In [170]: mask = a1.astype(bool)
In [171]: mask
Out[171]: array([ True, True, True, False, False, False, False, True, True, True], dtype=bool)
In [172]: a2 = np.arange(10,20)
In [173]: a1+a2
Out[173]: array([11, 12, 13, 13, 14, 15, 16, 18, 19, 20])
In [174]: np.add(a1,a2)
Out[174]: array([11, 12, 13, 13, 14, 15, 16, 18, 19, 20])
In [175]: np.add(a1,a2, where=mask, out=r);
In [176]: r
Out[176]: array([11, 12, 13, 3, 4, 5, 6, 18, 19, 20])
如果没有out
,则where
会随机离开'掩盖元素中的值。
在上一篇文章中,此where
的时间与masked
等效时间大致相同。
如果您想使用复合蒙版,请尝试mask = (a1!=0) & (a2>15)
之类的内容。 ()很重要。