首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用np.invert反演布尔阵列

用np.invert反演布尔阵列
EN

Stack Overflow用户
提问于 2021-05-02 12:00:32
回答 2查看 308关注 0票数 1

我有两个布尔数组a和b,我想要一个由此产生的布尔数组c,这样如果b中的条件为True,则a中的每个元素被反转,如果b中的条件为false,则保持原始。

代码语言:javascript
复制
a = np.array([True, False, True, True, False])

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

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

预期产出:

代码语言:javascript
复制
c = np.array([False, False, True, True, True])

然而,这是我得到的输出:

代码语言:javascript
复制
c = np.array([False False False False  True])

为何会这样呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-05-02 12:07:08

where=b传递给numpy.invert并不意味着“保留b未选择的单元的原始a值”。它的意思是“对于b没有选择的单元格,不要向输出数组写入任何东西”。由于您没有传递初始化的out数组,所以未选择的单元格在分配该内存时会填充任何发生在内存中的垃圾。

由于NumPy有一些用于小数组缓冲区的空闲列表,所以我们可以通过让NumPy重用包含我们所需内容的分配来演示输出是未初始化的垃圾:

代码语言:javascript
复制
import numpy

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

输出:

代码语言:javascript
复制
array([ True, False,  True, False])

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

至于您想要执行的操作,这只是XOR:c = a ^ b

票数 0
EN

Stack Overflow用户

发布于 2021-05-02 15:24:54

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

代码语言:javascript
复制
In [242]: np.invert(a,where=b, out=a)
Out[242]: array([False, False,  True,  True,  True])
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67356128

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档