设x为NumPy数组。以下几点:

(x > 1) and (x < 3)

给出错误信息:

ValueError:包含多个元素的数组的真值为 模糊。使用a.any()或a.all()

我怎么解决这个问题?


当前回答

如果你与熊猫一起工作,为我解决的问题是,当我有NA值时,我试图做计算,解决方案是运行:

Df = Df .dropna()

在那之后,计算失败了。

其他回答

最简单的答案是用“&”而不是“and”。

>>> import numpy as np
>>> arr = np.array([1, 4, 2, 7, 5])
>>> arr[(arr > 3) and (arr < 6)]   # this will fail
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()
>>> arr[(arr > 3) & (arr < 6)]   # this will succeed
array([4, 5])

通常,当比较两个单个数字时,Python常规代码可以正常工作,但在数组中,有一些数字(不止一个数字)应该并行处理。

例如,让我们假设如下:

a = np.array([1, 2, 3])
b = np.array([2, 3, 4])

你想检查b >= a: ?

因为,a和b不是个位数,你的意思是,如果b的每个元素都大于a中相似的数字,那么你应该使用以下命令:

if (b >= a).all():
 print("b is greater than a!")

如果你与熊猫一起工作,为我解决的问题是,当我有NA值时,我试图做计算,解决方案是运行:

Df = Df .dropna()

在那之后,计算失败了。

对我来说,这个错误发生在测试中,代码错误如下:

pixels = []
self.pixels = numpy.arange(1, 10)
self.assertEqual(self.pixels, pixels)

这段代码返回:

ValueError:具有多个元素的数组的真值是不明确的。使用a.any()或a.all()

因为我不能用列表断言numpy方法排列返回的对象。

解决方案是将numpy的排列对象转换为列表,我的选择是使用toList()方法,如下所示:

pixels = []
self.pixels = numpy.arange(1, 10).toList()
self.assertEqual(self.pixels, pixels)

出现异常的原因是and隐式调用bool。首先在左操作数上,然后(如果左操作数为True)在右操作数上。所以x和y等价于bool(x)和bool(y)

但是,numpy上的bool类型。Ndarray(如果它包含多个元素)将抛出你所看到的异常:

>>> import numpy as np
>>> arr = np.array([1, 2, 3])
>>> bool(arr)
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

bool()调用在and中是隐式的,但在if、while和or中也是隐式的,因此以下任何示例也会失败:

>>> arr and arr
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

>>> if arr: pass
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

>>> while arr: pass
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

>>> arr or arr
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

Python中还有更多隐藏bool调用的函数和语句,例如2 < x < 10就是2 < x和x < 10的另一种写法。And将调用bool: bool(2 < x)和bool(x < 10)。

和的元素等效形式是np。Logical_and函数,类似地,您可以使用np。Logical_or等价于或。

对于布尔数组——以及NumPy数组上的<、<=、==、!=、>=和>等比较返回布尔NumPy数组——您还可以使用按元素的位函数(和操作符):np。Bitwise_and(&运算符)

>>> np.logical_and(arr > 1, arr < 3)
array([False,  True, False], dtype=bool)

>>> np.bitwise_and(arr > 1, arr < 3)
array([False,  True, False], dtype=bool)

>>> (arr > 1) & (arr < 3)
array([False,  True, False], dtype=bool)

和bitwise_or(|操作符):

>>> np.logical_or(arr <= 1, arr >= 3)
array([ True, False,  True], dtype=bool)

>>> np.bitwise_or(arr <= 1, arr >= 3)
array([ True, False,  True], dtype=bool)

>>> (arr <= 1) | (arr >= 3)
array([ True, False,  True], dtype=bool)

一个完整的逻辑和二进制函数列表可以在NumPy文档中找到:

“逻辑功能” “二进制操作”