我正在使用 Python 2.7 和 NumPy 处理大型 boolean 值数组。
我有一个数组 A,它是这样的:
>>> A
array([[[False, False, True, True, True],
[False, False, False, True, True],
[False, False, True, True, True],
[False, False, False, True, True],
[False, False, False, False, True]],
[[False, True, True, True, True],
[False, True, True, True, True],
[False, False, True, True, True],
[False, True, True, True, True],
[False, False, True, True, True]]])
我必须像这样把它变成一个 boolean 数组:
>>> B
array([[[True, False, True, True, True],
[True, True, False, True, True],
[True, False, True, True, True],
[True, True, False, True, True],
[True, True, True, False, True]],
[[False, True, True, True, True],
[False, True, True, True, True],
[True, False, True, True, True],
[False, True, True, True, True],
[True, False, True, True, True]]])
因此,想法是每行的最后一个 False
值应该保留,任何其他值都应该变为 True
。
我需要创建它以便将其用作另一个数组的掩码。
有没有办法在不使用 for
循环的情况下使用 NumPy 来做到这一点(这很慢)?
最佳答案
您也可以为此目的使用异或运算符 ^
。只需将数组“左移”一位并将 True
值添加到右侧,然后对新数组和旧数组进行异或运算:
A = np.array([[False, False, True, True, True],
[False, False, False, True, True],
[False, False, True, True, True],
[False, False, False, True, True],
[False, False, False, False, True]])
X = np.hstack((A[:,1:],
np.array(np.ones((A.shape[0], 1)), dtype=np.bool))))
>>> array([[False, True, True, True, True],
[False, False, True, True, True],
[False, True, True, True, True],
[False, False, True, True, True],
[False, False, False, True, True]])
np.invert(A ^ X)
>>> array([[True, False, True, True, True],
[True, True, False, True, True],
[True, False, True, True, True],
[True, True, False, True, True],
[True, True, True, False, True]])
这仅在所有 False
值都被保留且后面仅跟有 True
值时有效。
关于python - 如何有效地将 boolean numpy 数组转换为阈值 boolean 数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26545198/