python:numpy数组的条件加号运算符
我想在两个numpy数组上应用加号操作符。然而,有一个限制。 我只想对数组1中的元素求和,如果它不是零。我可以做一个循环,但是速度很慢。有没有一种典型的方法python:numpy数组的条件加号运算符,python,numpy,Python,Numpy,我想在两个numpy数组上应用加号操作符。然而,有一个限制。 我只想对数组1中的元素求和,如果它不是零。我可以做一个循环,但是速度很慢。有没有一种典型的方法 if a1[xyz] != 0: r[xyz] = a1[xyz] + a2[xyz] 使用遮罩: mask = a1 != 0 r[mask] = a1[mask] + a2[mask] 这假设r、a1、a2具有相同的形状。使用遮罩: mask = a1 != 0 r[mask] = a1[mask] + a2[mask]
if a1[xyz] != 0:
r[xyz] = a1[xyz] + a2[xyz]
使用遮罩:
mask = a1 != 0
r[mask] = a1[mask] + a2[mask]
这假设r、a1、a2具有相同的形状。使用遮罩:
mask = a1 != 0
r[mask] = a1[mask] + a2[mask]
这假设r,a1,a2
具有相同的形状。另一种快速方式:np。其中(a1==0,r,a1+a2)
另一种快速方式:np。其中(a1==0,r,a1+a2)
如我在中所述,许多ufunc
采用where
参数
在这种情况下,我们可以使用np。通过以下方式添加:
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
会在屏蔽掉的元素中留下“随机”值
在上一篇文章中,此中
的计时与屏蔽的
等效程序大致相同
如果要使用复合遮罩,请尝试类似于mask=(a1!=0)和(a2>15)
的方法。()很重要。正如我在中所指出的,许多ufunc
使用where
参数
在这种情况下,我们可以使用np。通过以下方式添加:
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
会在屏蔽掉的元素中留下“随机”值
在上一篇文章中,此中
的计时与屏蔽的
等效程序大致相同
如果要使用复合遮罩,请尝试类似于mask=(a1!=0)和(a2>15)
的方法。(),错过了。我想你正在寻找np。其中使用掩蔽:r=a1+a2*(a1!=0)
,对于初始化的r
@Divakar OP的代码似乎更新了一个现有的r
而没有触及a1==0
@PaulPanzer的值,这就是为什么注释末尾的限定符。@Divakar,抱歉,错过了。谢谢,奇怪的是,如果我添加多个条件,我似乎会中断:mask=(img_数组==0或img_数组==1)你知道为什么吗?或
在元素方面不起作用。您必须使用|
。由于运算符的优先级,您还必须在各个条件周围加上括号。谢谢,奇怪的是,如果我添加多个条件,我似乎会中断:mask=(img_数组==0或img_数组==1)您知道为什么吗?或
在元素方面不起作用。您必须使用|
。由于运算符的优先级,您还必须在各个条件周围加上括号。