使用 np.invert 反转布尔数组

Inverting boolean array using np.invert

我有两个布尔数组 a 和 b。我想要一个结果布尔数组 c,如果 b 中的条件为真,则 a 中的每个元素都被反转,如果 b 中的条件为假,则保持原始元素。

a = np.array([True, False, True, True, False])

b = np.array([True, False, False, False, True])

c = np.invert(a, where=b)

预期输出:

c = np.array([False, False, True, True, True])

然而这是我得到的输出:

c = np.array([False False False False  True])

为什么会这样?

where=b 传递给 numpy.invert 并不意味着“为未被 b 选择的单元格保留原始 a 值”。这意味着“对于未被 b 选择的单元格,不要向输出数组写入任何内容”。由于您没有传递初始化的 out 数组,因此未选择的单元格中会填入分配内存时碰巧出现在该内存中的任何垃圾。

由于 NumPy 有一些用于小型数组缓冲区的空闲列表,我们可以通过让 NumPy 重用我们想要的任何填充的分配来证明输出是未初始化的垃圾:

import numpy

a = numpy.zeros(4, dtype=bool)
numpy.array([True, False, True, False])
print(repr(numpy.invert(a, where=a)))

输出:

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

在此示例中,我们可以看到 NumPy 重用了我们创建但未保存的数组中的缓冲区。由于 where=a 没有选择任何单元格,numpy.invert 没有向缓冲区写入任何内容,结果正是丢弃数组的内容。


至于你要执行的操作,那只是异或:c = a ^ b

您需要包含一个 out 来指定 not-where 元素的值。否则他们是不可预测的。

In [242]: np.invert(a,where=b, out=a)
Out[242]: array([False, False,  True,  True,  True])