假设我有两个 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/