我刚刚在我的代码中发现了一个逻辑错误,它导致了各种各样的问题。我无意中做了位AND而不是逻辑AND。
我把代码从:
r = mlab.csv2rec(datafile, delimiter=',', names=COL_HEADERS)
mask = ((r["dt"] >= startdate) & (r["dt"] <= enddate))
selected = r[mask]
到:
r = mlab.csv2rec(datafile, delimiter=',', names=COL_HEADERS)
mask = ((r["dt"] >= startdate) and (r["dt"] <= enddate))
selected = r[mask]
令我惊讶的是,我得到了一个相当神秘的错误消息:
ValueError:包含多个元素的数组的真值不明确。使用a.any()或a.all()
为什么在使用逐位操作时没有发出类似的错误?如何修复?
出现异常的原因是和
隐式调用bool
。首先在左操作数上,然后在右操作数上(如果左操作数为True
)。所以x和y
相当于bool(x)和bool(y)
。
但是numpy.ndarray
上的bool
(如果它包含多个元素)将抛出您看到的异常:
>>> 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()
调用在和
中是隐式的,但在if
、while
、或
中也是隐式的,因此以下任何示例也将失败:
>>> 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
和
在元素方面的等价物是np.logical\u和
函数,类似地,您可以使用np.logical\u或
作为或
的等价物。
对于布尔数组和比较,如
>>> 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留档中找到:
逻辑函数
- 二元运算
我也遇到了同样的问题(即使用多个条件进行索引,这里是查找特定日期范围内的数据)。(a-b).any()
或(a-b).all()
似乎不起作用,至少对我来说是这样。
或者,我找到了另一种解决方案,该解决方案非常适合我所需的功能(当尝试索引数组时,具有多个元素的数组的真值是模糊的)。
不要使用上面建议的代码,简单地使用numpy.logical_and(a, b)
就可以了。在这里,您可能想要重写代码
selected = r[numpy.logical_and(r["dt"] >= startdate, r["dt"] <= enddate)]
r
是一个numpy(rec)数组。所以r[“dt”]
NumPy开发人员认为,在布尔上下文中,没有一种普遍理解的方法来计算数组:如果任何元素
True
,它可能意味着True
;如果所有元素True
,它可能意味着True
,或者如果数组长度非零,那么它可能意味着True
,仅举三种可能性。
由于不同的用户可能有不同的需求和不同的假设,NumPy开发人员拒绝猜测,而是决定在尝试在布尔上下文中计算数组时提出ValueError。将
和
应用于两个numpy数组会导致在布尔上下文中对这两个数组求值(通过在Python3中调用\uuuubool\uuuu
,或在Python2中调用\uuuu nonzero\uuuu
)。
你的原始代码
mask = ((r["dt"] >= startdate) & (r["dt"] <= enddate))
selected = r[mask]
看起来不错。但是,如果您确实想要
和
,则使用
(a-b).any()
或(a-b).all()代替
a和b
。
问题内容: 我只是在代码中发现了一个逻辑错误,该错误导致了各种各样的问题。我在无意中执行了按位AND运算,而不是逻辑AND 运算。 我将代码从: 至: 令我惊讶的是,我得到了一个相当神秘的错误消息: :具有多个元素的数组的真值不明确。使用或 为什么在使用按位运算时没有发出类似的错误?如何解决此错误? 问题答案: r是一个数组。(boolean)数组也是如此。对于numpy数组,该&操作返回两个布尔
我有一个数据帧“信号”: 因为我需要一些条件来设置我的“\u exec\u dict”,这是一个告诉交易平台我的订单是什么的字典? 问题是我不能使用 来做条件判定。 要进行测试,请执行以下操作: 有一些改变, 结果是: 搜索后,像一个系列的真相值是模糊的。使用a.empty、a.bool()、a.item()、a.any()或a.all()
问题内容: 如果var(另一个numpy数组)中的元素> = 0和<=。1,我试图将rbs的所有元素放入一个新数组中。但是,当我尝试以下代码时,出现此错误: 关于我在做什么错的任何想法? 问题答案: 正如我在对先前答案的评论中告诉您的那样,您需要使用以下任一方法: 要么 原因是Python使用该关键字在两个布尔值之间进行测试。数组如何成为布尔值?如果它的75%的商品是,还是?因此,numpy拒绝比
下面的代码给我值错误: ValueError:序列的真值不明确。使用a.empty、a.bool()、a.item()、a.any()或a.all()
但我有一个错误。 ValueError:序列的真值不明确。使用a.empty、a.bool()、a.item()、a.any()或a.all()。 我怎样才能修好它?
当我运行以下代码时: 它给出了以下错误: ValueError:序列的真值不明确。 使用a.empty、a.bool()、a.item()、a.any()或a.all() 这里怎么了?