Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么比较两个元组(每个元组包含一个NumPy对象)会抱怨真相?_Python_Python 3.x_Numpy - Fatal编程技术网

Python 为什么比较两个元组(每个元组包含一个NumPy对象)会抱怨真相?

Python 为什么比较两个元组(每个元组包含一个NumPy对象)会抱怨真相?,python,python-3.x,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)

假设我有两个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()
>(1,a)>(1,b)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
ValueError:包含多个元素的数组的真值不明确。使用a.any()或a.all()
熊猫
系列
对象也会出现类似情况;在这种情况下,将调用
\uuuuu nonzero\uuuu
。Python文档说该方法用于转换为
bool
,这在这里似乎不相关

关于如何正确完成比较,还有很多问题

但是,我的问题是:为什么会发生这种情况?布尔人是如何参与进来的?为什么不能比较对象没有更符合逻辑的例外

这是Python 3.4。

这是

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
通常在常规Python表达式执行逻辑运算时出现(
等),并且
numpy
对象返回布尔数组

一个明显的例子是:

if np.array([True,False]):1
if
要求一个简单的True/False,但该值是一个数组

您的示例稍微复杂一些,因为我们必须知道Python如何对元组(以及可能的列表)执行
测试。我认为它会逐个元素进行比较,然后将结果与and/or相结合

不管细节如何,元组的数组元素都返回布尔数组,而Python逻辑操作需要标量布尔。因此出现了错误消息

产生此错误的另一个上下文:

bool([False,False])  # == False
bool(np.array([False,False]))  # this ValueError
bool(np.array([1]))  # True
bool(np.array([]))   # False
bool()
应用于1或0元素数组是正常的,否则会产生此错误。我怀疑Python
在组合它们之前将
bool()
应用于它们的每个参数

我发现numpy C代码(在
\u array\u nonzero
函数中)中产生了这个
不明确的
ValueError,但无法跟踪Python
bool
如何调用它

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
通常在常规Python表达式执行逻辑运算时出现(
等),并且
numpy
对象返回布尔数组

一个明显的例子是:

if np.array([True,False]):1
if
要求一个简单的True/False,但该值是一个数组

您的示例稍微复杂一些,因为我们必须知道Python如何对元组(以及可能的列表)执行
测试。我认为它会逐个元素进行比较,然后将结果与and/or相结合

不管细节如何,元组的数组元素都返回布尔数组,而Python逻辑操作需要标量布尔。因此出现了错误消息

产生此错误的另一个上下文:

bool([False,False])  # == False
bool(np.array([False,False]))  # this ValueError
bool(np.array([1]))  # True
bool(np.array([]))   # False
bool()
应用于1或0元素数组是正常的,否则会产生此错误。我怀疑Python
在组合它们之前将
bool()
应用于它们的每个参数


我发现numpy C代码(在
\u array\u nonzero
函数中)中产生了这个
不明确的
值错误,但我无法跟踪Python
bool
如何调用它。

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

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=np.array([1,2,3])
b=np.数组([2,3,4])
c=a
元组比较
a
相当于:

for x, y in zip(a,b):
    if x < y: return True
    if x > y: return False
return len(a) < len(b)
邮政编码(a,b)中x,y的
:
如果xy:返回False
返回长度(a)

if
语句对元素级比较的结果执行隐式的
bool()
转换。在Python2中,对自定义类的对象调用
bool
是通过类的
\uuuu非零\uuuu
方法实现的,而在Python3中则是
\uuuuu bool\uuu
bool(array)
调用会给出错误消息。

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

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=np.array([1,2,3])
b=np.数组([2,3,4])
c=a
元组比较
a
相当于:

for x, y in zip(a,b):
    if x < y: return True
    if x > y: return False
return len(a) < len(b)
邮政编码(a,b)中x,y的
:
如果xy:返回False
返回长度(a)
if
语句对元素级比较的结果执行隐式的
bool()
转换。在Python2中,对自定义类的对象调用
bool
是通过类的
\uuuu非零\uuuu
方法实现的,而在Python3中则是
\uuuuu bool\uuu
bool(array)
调用将向您提供错误消息