设x为NumPy数组。以下几点:
(x > 1) and (x < 3)
给出错误信息:
ValueError:包含多个元素的数组的真值为 模糊。使用a.any()或a.all()
我怎么解决这个问题?
设x为NumPy数组。以下几点:
(x > 1) and (x < 3)
给出错误信息:
ValueError:包含多个元素的数组的真值为 模糊。使用a.any()或a.all()
我怎么解决这个问题?
当前回答
对我来说,这个错误发生在测试中,代码错误如下:
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)
其他回答
以@ZF007的回答为例,这并不是在整体上回答你的问题,但可以作为同样错误的解决方案。我把它贴在这里,因为我还没有找到一个直接的解决方案来回答这个错误消息在Stack Overflow的其他地方。
当您检查数组是否为空时,会出现此错误。
if np.array([1,2]): print(1) --> ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all(). if np.array([1,2])[0]: print(1) --> no ValueError, but: if np.array([])[0]: print(1) --> IndexError: index 0 is out of bounds for axis 0 with size 0. if np.array([1]): print(1) --> no ValueError, but again will not help at an array with many elements. if np.array([]): print(1) --> DeprecationWarning: The truth value of an empty array is ambiguous. Returning False, but in future this will result in an error. Use 'array.size > 0' to check that an array is not empty. if np.array([]).size is not None: print(1): Taking up a comment by this user, this does not work either. This is since no np.array can ever be the same object as None - that object is unique - and thus will always match is not None (i.e. never match is None) whether or not it's empty.
这样做:
如果np.array([])。大小:打印(1)解决了错误。
如果你与熊猫一起工作,为我解决的问题是,当我有NA值时,我试图做计算,解决方案是运行:
Df = Df .dropna()
在那之后,计算失败了。
出现异常的原因是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文档中找到:
“逻辑功能” “二进制操作”
这个类型化的错误消息还显示了当存在数组(例如bool或int类型)时执行if语句比较。请看例子:
... code snippet ...
if dataset == bool:
....
... code snippet ...
这个子句有dataset作为数组,bool是euhm的“打开的门”…对或错。
如果函数被包装在try-statement中,你将接收到带有except Exception的错误:没有error-type的消息:
具有多个元素的数组的真值是不明确的。使用a.any()或a.all()
我也遇到了同样的问题(即多条件索引,这里是在某个日期范围内查找数据)。(a-b).any()或(a-b).all()似乎不起作用,至少对我来说是这样。
或者,我找到了另一个解决方案,它完美地满足了我想要的功能(当尝试索引数组时,具有多个元素的数组的真值是不明确的)。
与其使用上面建议的代码,不如使用:
numpy.logical_and(a, b)