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)