我只是在代码中发现了一个逻辑错误,该错误导致了各种各样的问题。我在无意中执行了按位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()
ValueError
a.any()
a.all()
为什么在使用按位运算时没有发出类似的错误?如何解决此错误?
r是一个numpy(rec)数组。r["dt"] >= startdate(boolean)数组也是如此。对于numpy数组,该&操作返回两个布尔数组中的elementwise和。
numpy(rec)
r["dt"] >= startdate
elementwise
该NumPy的开发者觉得有没有人通常理解的方式来评估布尔上下文中的数组:这可能意味着True,如果任何元素 True,或者它可能意味着True,如果所有元素True,或者True如果该数组有非0的长度,只是说出三种可能性。
True
由于不同的用户可能有不同的需求和不同的假设,因此NumPy开发人员拒绝猜测,而是决定每当尝试在布尔上下文中评估数组时就引发ValueError。应用于and两个numpy数组将导致两个数组在布尔上下文中求值(通过__bool__在Python3或__nonzero__Python2中调用)。
NumPy
numpy
__bool__在Python3
__nonzero__Python2
你的原始代码
mask = ((r["dt"] >= startdate) & (r["dt"] <= enddate)) selected = r[mask]
看起来很正确。但是,如果确实需要and,则可以a and b使用(a-b).any()或代替(a-b).all()。
a and b使
(a-b).any()
(a-b).all()