NumPy 使用掩码翻转二进制数组
问题描述
我有一个N乘N(N约为200)的二进制NumPy数组,由零和一填充。我想应用一个布尔掩码,并“交换”掩码中对应为 真(True)
的值,所以例如,如果我有:
arr = np.array([0,0,1,1],
[0,0,1,1],
[0,0,1,1],
[0,0,1,1])
mask = np.array([True,False,True,False],
[True,False,True,False],
[True,False,True,False],
[True,False,True,False],
我希望得到的结果数组是:
arr_new = np.array([1,0,0,1],
[1,0,0,1],
[1,0,0,1],
[1,0,0,1])
我首先通过创建一个函数swap_cell
来交换值:
def swap_cell(x):
if x == 1.0:
return 0.0
elif x == 0.0:
return 1.0
arr_new = np.where(mask,swap_cell(arr),arr)
这段代码返回 ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
,我理解是因为在我的 swap_cell()
函数中的 ‘if’ 语句造成的。我知道肯定有一个更加 pythonic 的方法来解决这个问题,但我认为这个方法可能有效。
解决方案
如果你将第一个(0,1)数组解释为布尔数组,则你正在对第一个数组的每个条目与第二个数组的每个条目进行异或运算。
因此,你可以使用numpy函数 np.logical_xor() 来实现如下:
arr = np.array([[0,0,1,1],
[0,0,1,1],
[0,0,1,1],
[0,0,1,1]])
mask = np.array([[True,False,True,False],
[True,False,True,False],
[True,False,True,False],
[True,False,True,False]])
np.array(np.logical_xor(arr, mask), dtype=int)
返回
array([[1, 0, 0, 1],
[1, 0, 0, 1],
[1, 0, 0, 1],
[1, 0, 0, 1]])