Python Numpy数组条件操作掩码?

Python Numpy数组条件操作掩码?,python,arrays,numpy,Python,Arrays,Numpy,假设您有一个数组: a= [ 0,1,0] [-1,2,1] [3,-4,2] 让我们假设你在每件事上加上20 b= [ 20, 21, 20] [ 19, 22, 21] [ 23, 16, 22] 现在让我们假设我想将结果b添加到原始数组a,但仅在a

假设您有一个数组:

a=
[ 0,1,0]
[-1,2,1]
[3,-4,2]

让我们假设你在每件事上加上20


b=
[  20,  21, 20]
[  19,  22, 21]
[  23,  16, 22]

现在让我们假设我想将结果
b
添加到原始数组
a
,但仅在
a<0
的情况下,即在索引
[0,1]
[1,2]
处,其中
a=-1,-4
分别获得值0,否则。最终形成如下矩阵:


c=
[ 0,  0, 0]
[ 18, 0, 0] 
[ 0, 12, 0]

18=19(从b开始)+-1(从a开始)
12=16(从b开始)+-4(从a开始)

假设我希望能够将其扩展到任何操作(而不仅仅是添加20),这样您就不能从矩阵
c
中筛选所有<20的值。因此,我想使用矩阵
a
作为矩阵c的掩码,将
I,j
归零,其中
a[I,j]<0

我很难找到一个简洁的例子来说明如何用python在numpy中实现这一点。我希望你能指导我如何正确实施这种方法

我正在努力将其放入掩码中,只对保留的值执行操作,最终导致
c


提前感谢您的帮助。

也许不是最干净的解决方案,但这个怎么样

def my_mask(a, b, threshold=0):
    c = numpy.zeros(a.shape)
    idx = np.where(a < threshold)
    for ii in idx:
        c[ii[1], ii[0]] = a[ii[1], ii[0]] + b[ii[1], ii[0]]
    return c
def my_掩码(a,b,阈值=0):
c=整数零(a形状)
idx=np.其中(a<阈值)
对于idx中的ii:
c[ii[1],ii[0]]=a[ii[1],ii[0]]+b[ii[1],ii[0]]
返回c

可能类似于:

(a + b)*(a<0)

(a+b)*(a您可以通过和的组合来实现。下面的工作示例

import numpy as np
a = np.array([[ 0,1,0],[-1,2,1],[3,-4,2]])
b = a+20
c = np.zeros(a.shape)
c[a<0] = b[a<0] + a[a<0]

上面代码片段中唯一重要的一行是最后一行。因为
a
b
c
的条目都是对齐的,我们可以说我们只需要
c
的相应索引,其中
a使用
numpy.zeros\u like
函数的解决方案:

import numpy as np

# the initial array
a = [[ 0,1,0],
     [-1,2,1],
     [3,-4,2]]

a = np.array(a)
b = a + 20                         # after adding 20 to each element
c = np.zeros_like(a)               # resulting matrix (filled with zeros by default)
neg = a < 0                        # indeces of negative values
c[neg] = b[neg] + a[neg]           # overriding the needed elements

print(c)

以下是获得相同结果的另一种方法:

c = np.where(a < 0, a + b, 0)
c=np,其中(a<0,a+b,0)
虽然这比以前要详细一点,但我发现方法签名类似于三元操作(
a<0?a+b:0
),这使我更容易理解它正在做什么。而且,在我看来,这仍然是一个单行程序,使它足够优雅


参考:

非常优雅的解决方案!这是最优雅的解决方案。我无法想象有人有更干净的方法。执行得非常干净。谢谢。在处理NumPy数组时,应该避免For循环,除非所需的操作无法矢量化。这很好,但没有Thomas的解决方案那么优雅。谢谢链接和尝试。
[[ 0  0  0]
 [18  0  0]
 [ 0 12  0]]
c = np.where(a < 0, a + b, 0)