是什么解释了列表和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数组的处理方式不同?
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
与&
。
问题内容: 因此,我没有讲一个很长的故事,而是在编写一些代码,即从二进制文件中读取一些数据,然后使用for循环遍历每个点。因此,我完成了代码,运行速度非常慢。我从约128个数据通道中遍历了约60,000个点,这需要一分钟或更长时间来处理。这比我预期的Python运行速度要慢得多。因此,我通过使用Numpy使整个事情变得更加高效,但是在试图弄清为什么原始进程运行如此缓慢的过程中,我们进行了一些类型检
问题内容: 中的运算符似乎在列表上运行异常。谁能告诉我这是怎么回事? 输出值 似乎影响类的每个实例,而似乎以我希望事情表现的方式表现。 该+=运算符称为“化合物赋值运算符”。 问题答案: 一般的答案是+=尝试调用特殊方法,如果该方法不可用,它将尝试使用替代方法。因此,问题在于这些特殊方法之间的差异。 的特殊方法是就地此外,这是它发生变异,它作用于对象。该特殊方法返回一个新的对象,也可用于标准+操作
问题内容: 当我遇到性能问题时,我只是更改了一个正在编写的程序,以将数据存储为numpy数组,而两者之间的区别令人难以置信。最初耗时30分钟,而现在耗时2.5秒! 我想知道它是如何做到的。我认为这是因为它消除了对循环的需要,但除此之外,我感到很困惑。 问题答案: 块状阵列是均质类型的密集堆积阵列。相比之下,Python列表是指向对象的指针数组,即使它们都属于同一类型。因此,您可以获得引用局部性的好
问题内容: 我有不同长度的清单清单(例如),并想将其转换成整数数组。我了解多维数组中的“子”数组必须具有相同的长度。那么将上述示例中的列表转换成这样的数组(即用零完成)的最有效方法是什么? 问题答案: 您可以使用np.zeros创建一个numpy数组,并用列表元素填充它们,如下所示。 结果是
问题内容: 与常规Python列表相比,NumPy有什么优势? 我有大约100个金融市场系列,我将创建一个100x100x100 = 1百万个单元的多维数据集数组。我将每个x与y和z回归(3变量),以用标准误差填充数组。 我听说对于“大型矩阵”,出于性能和可伸缩性的原因,我应该使用NumPy而不是Python列表。事实是,我知道Python列表,它们似乎对我有用。 如果我转到NumPy,会有什么好
问题内容: 是否可以从python列表构造NumPy数组? 问题答案: 首先,建议您阅读NumPy的 快速入门教程,该教程可能会帮助您解决这些基本问题。 您可以从列表中直接创建一个数组,如下所示: 或以相同的方式从嵌套列表中获取: