python - 为什么比较两个分别包含一个 NumPy 对象的元组会报错?

标签 python python-3.x numpy

假设我有两个 NumPy 数组:

>>> import numpy as np
>>> a = np.arange(2)
>>> b = np.arange(2)

可以在不引发异常的情况下比较它们,尽管结果如预期的那样不是单个值:

>>> a > b
array([False, False], dtype=bool)

但是,将它们放在需要比较它们的元组比较中确实会引发异常:

>>> (1, a) > (1, b)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

类似的情况也发生在 Pandas Series 对象上;在这种情况下,将调用 __nonzero__。 Python 文档说该方法用于转换为 bool,这在这里似乎不相关。

another question关于如何正确完成比较。

但是,我的问题是:为什么会发生这种情况? bool 值如何参与?为什么没有关于无法比较对象的更合乎逻辑的异常?

这是 Python 3.4。

最佳答案

当你比较 numpy 数组时,你会得到一个 bool numpy 数组。但是,当您在 Python 中比较元组时,它会将元组的相应元素相互比较,并期望返回一个 bool 值。

a = np.array([1,2,3])
b = np.array([2,3,4])
c = a < b # np.array([True, True, True], dtype=bool)
bool(c) # raises an exception

元组比较 a < b相当于:

for x, y in zip(a,b):
    if x < y: return True
    if x > y: return False
return len(a) < len(b)

if语句执行隐式 bool()转换元素比较的结果。在 Python 2 中,调用 bool在自定义类的对象上由类的 __nonzero__ 实现方法,在 Python 3 中它是 __bool__ . bool(array)调用是给您错误消息的原因。

关于python - 为什么比较两个分别包含一个 NumPy 对象的元组会报错?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32342292/

相关文章:

python - 如果子项中没有某些内容,我如何附加父项中的内容?

python - 按列表 len 排序列表列表

python - csv writer 添加不需要的逗号

python - 替换Python中除了第一次出现的子字符串之外的所有内容?

python - `platforms` 中 `setup()` 的 `setup.py` 参数有什么作用?

python - 计算随机2个人在同一组的概率?

python - numpy 数组按向量划分列

python - python 中的低通滤波器

python-3.x - ElasticSearch中的地理距离排序?

python - 使用 matplotlib 绘图 : hours shown as float