我有一个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的情况下简洁地做到这一点?
使用输入数组:
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]]