我有两个布尔数组a和b,我想要一个由此产生的布尔数组c,这样如果b中的条件为True,则a中的每个元素被反转,如果b中的条件为false,则保持原始。
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])为何会这样呢?
发布于 2021-05-02 12:07:08
将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没有向缓冲区写入任何内容,结果就是丢弃数组的内容。
至于您想要执行的操作,这只是XOR:c = a ^ b
发布于 2021-05-02 15:24:54
您需要包含一个out来指定not元素的值。否则,它们是不可预测的。
In [242]: np.invert(a,where=b, out=a)
Out[242]: array([False, False, True, True, True])https://stackoverflow.com/questions/67356128
复制相似问题