提问者:小点点

Numpy:我如何向量应用蒙版?


我有一个numpy数组,它是一个向量列表,比如

arr1 = [ [ 1, 2 ], [ 2, 2 ], [ 5, 3 ], [ 9, -1 ], [ 6, 3 ], ... ]

对应于x,y值对。 我希望使用x和y组件的条件来设置掩码,例如0<; x<; 4和0<; y<; 7,以这样的方式为上面的面具看起来像:

[ [ True, True ], [ True, True ], [ False, False ], [ False, False ], [ False, False ], ... ]

换句话说,对于数组中的每个向量,我希望掩码对于两个分量都具有相同的真值,并且只有在x和y的条件都满足的情况下才返回true。 我尝试了如下方式:

masked = numpy.ma.array(arr1, mask= [0<arr1[:,0]<4 & 0<arr1[:,1]<7, 0<arr1[:,0]<4 & 0<arr1[:,1]<7])

但是它告诉我“一个数组的真值有多个元素是不明确的。” 有没有一种方法可以在不使用循环或if elses的情况下简洁地做到这一点?


共2个答案

匿名用户

使用输入数组:

print(arr1)
array([[ 1,  2],
       [ 2,  2],
       [ 5,  3],
       [ 9, -1],
       [ 6,  3]])

您可以单独检查每个列上的条件(请注意,链式比较在NumPy中不起作用)。 然后取两个条件的按位AND并广播到数组的形状:

x = arr1[:,0] 
y = arr1[:,1] 

c1 = (x>0)&(x<4)
c2 = (y>0)&(y<7)

np.broadcast_to((c1&c2)[:,None], arr1.shape)
array([[ True,  True],
       [ True,  True],
       [False, False],
       [False, False],
       [False, False]])

匿名用户

您可以使用all()方法来理解列表:

arr1 = [[ 1, 2 ],
        [ 2, 2 ],
        [ 5, 3 ],
        [ 9, -1 ],
        [ 6, 3 ]]

masked = [[all([0<x<4,0<y<7])]*2 for x,y in arr1]

print(masked)

输出:

[[True, True],
 [True, True],
 [False, False],
 [False, False],
 [False, False]]