如何获得布尔 numpy 数组和另一个数组的相对补码?

How to get the relative complement of a boolean numpy array and another?

假设我有两个 numpy 数组:

>>> v1
array([ True, False, False, False,  True])
>>> v2
array([False, False,  True,  True,  True])

我正在尝试检索一个长度相同 (5) 并且在 v1==True AND v2==False 的每个位置都包含 True 的数组。那将是:

array([True, False,  False,  False,  False])

在 numpy 中有没有快速的方法,比如 logical_not() 但考虑 v1 作为参考,v2 作为查询?

你只需要使用正确的bitwise operators:

v1 & ~v2
# array([ True, False, False, False, False])

您可以在此处使用 按位 运算符:

>>> v1 & ~v2
array([ True, False, False, False, False])

对于布尔值,逻辑运算和位运算是一样的。因此,写成

非常地道
v1 & ~v2

但是,这是一个按位运算,会产生一个可能不必要的临时数组。您不能随心所欲地编写 v1 and not v2,因为 python 期望将输入转换为单个布尔值。相反,您必须调用 logical_and and logical_not ufuncs:

np.logical_and(v1, np.logical_not(v2))

好处是您可以避免使用临时数组,甚至可以直接写入您选择的缓冲区:

result = np.empty_like(v1)
np.logical_not(v2, out=result)
np.logical_and(v1, result, out=result)

您甚至可以就地完成所有操作(在 v2 中):

np.logical_and(v1, np.logical_not(v2, out=v2), out=v2)