小编典典

'and' (boolean) vs '&' (bitwise) - 为什么列表与 numpy 数组的行为不同?

all

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

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

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 个示例。

示例 4 使我得到了我想要的输出,这很好,但我仍然对何时/如何/为什么应该使用andvs感到困惑&。为什么列表和 NumPy
数组对这些运算符的行为不同?

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


阅读 60

收藏
2022-08-24

共1个答案

小编典典

and测试两个表达式是否在逻辑上Truewhile &(当与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.

  • 如果您有想要组合的真值向量,请使用numpywith &

2022-08-24