'and'(布尔值)vs'&'(按位)-为什么列表与numpy数组在行为上有所不同?

rysqui:

是什么解释了列表和NumPy数组上布尔运算和按位运算的行为差异?

&and在Python中正确使用vs 感到困惑,如以下示例所示。

mylist1 = [True,  True,  True, False,  True]
mylist2 = [False, True, False,  True, False]

>>> len(mylist1) == len(mylist2)
True

# ---- Example 1 ----
>>> mylist1 and mylist2
[False, True, False, True, False]
# I would have expected [False, True, False, False, False]

# ---- Example 2 ----
>>> mylist1 & mylist2
TypeError: unsupported operand type(s) for &: 'list' and 'list'
# Why not just like example 1?

>>> import numpy as np

# ---- Example 3 ----
>>> np.array(mylist1) and np.array(mylist2)
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
# Why not just like Example 4?

# ---- Example 4 ----
>>> np.array(mylist1) & np.array(mylist2)
array([False,  True, False, False, False], dtype=bool)
# This is the output I was expecting!

这个答案这个答案帮助我理解这and是一个布尔运算,但是&是按位运算。

我阅读了有关按位运算的信息,以更好地理解该概念,但是我正在努力使用该信息来理解我上面的四个示例。

示例4使我达到了所需的输出,这很好,但是我仍然对何时/如何/为什么使用andvs 感到困惑&为什么列表和NumPy数组在这些运算符上的行为不同?

谁能帮助我理解布尔运算和按位运算之间的区别,以解释为什么它们对列表和NumPy数组的处理方式不同?

ramcdougal:

and测试两个表达式在逻辑上是否相符,True&(当与True/ False一起使用时)测试两个表达式是否均在逻辑上True

在Python中,空内置对象通常在逻辑上被视为False,而非空内置对象在逻辑上被视为True这可以简化常见的用例,在这种情况下,如果列表为空,则要执行某项操作;如果列表为空,则要执行其他操作。请注意,这意味着列表[False]在逻辑上是True

>>> if [False]:
...    print 'True'
...
True

因此,在示例1中,第一个列表是非空的,因此在逻辑上是True,因此的真值and与第二个列表的真值相同。(在我们的例子中,第二个列表是非空的,因此从逻辑上讲是True,但要识别出该列表将需要不必要的计算步骤。)

例如,2不能以位方式有意义地组合列表,因为它们可以包含任意不同的元素。可以按位组合的事物包括:对与错,整数。

相反,NumPy对象支持矢量化计算。也就是说,它们使您可以对多个数据执行相同的操作。

示例3失败了,因为NumPy数组(长度> 1)没有真值,因为这防止了基于向量的逻辑混乱。

示例4只是一个向量化位and操作。

底线

  • 如果您不处理数组并且不执行整数的数学运算,则可能需要and

  • 如果你有真值的载体,你想结合,使用numpy&

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么布尔值是1字节而不是1位大小?

按位运算结果和布尔值

在布尔值上使用按位非运算符(〜)是否会调用未定义行为?

将4位整数转换为布尔值列表

在C ++中按位与函数返回布尔值

按位和子数组的不同值

您可以按位将布尔值按C ++移位吗?

按布尔值排序

为什么两个示例的输出在Javascript布尔值方面有所不同?

通过保证按值传递布尔值是否有效?

将数组的布尔值推入uint8位域

C ++中带有布尔值的^(按位XOR)

位操作;将16位值转换为16个布尔值的数组?C语言

numpy中的内置函数可以按位方式将整数解释为布尔值数组吗?

如何按布尔值对数组排序

按位与如何与布尔值交互?

AsyncTask没有按预期返回布尔值

按布尔值排序

为什么在比较布尔值时,按位运算符比Java中的“正常”运算符要慢?

为什么布尔值在C ++中按位进行比较,而不是按其含义进行比较?

为什么对于相同但按比例缩放的数据,绘图的行为会有所不同?

带有 numpy 的布尔矩阵 - 按位运算问题

按字母顺序对对象的 JSON 数组以及 dart 中属性的布尔值进行排序

在 JavaScript 中按日期或布尔值对 JSON 对象数组进行排序

Kotlin 列表,按对象中的布尔值过滤

数组列表按布尔值排序,然后按日期 JavaScript / TypeScript

为什么 `std::array` 不像 `std::vector` 那样为布尔值提供位打包?

assertAll 布尔值列表

按布尔值数组动态过滤数组对象