python:numpy数组的条件加运算符

时间:2017-12-11 14:10:33

标签: python numpy

我想在两个numpy数组上应用plus运算符。但是,有一个收缩。 我只想在第一个数组中它不为零时总结该元素。我可以循环执行此操作,但这非常慢。是否有一种典型的方法?

if a1[xyz] != 0:
    r[xyz] = a1[xyz] + a2[xyz] 

3 个答案:

答案 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)之类的内容。 ()很重要。