我有2个具有不同值的数组和一个if语句,这些语句根据数组中的值返回True
或False
。
代码:
avgs = rotation / speed
if (avgs.all() <= 55.2 and avgs.all() >= 55): #if all avgs between 55 and 55.2 return false
return False
elif (avgs.any() >55.2 or avgs.any() < 55): #if any avgs above 55.2 or below 55 return true
return True
数组:
[55. 55. 55. 55. 55.]
和
[95. 55. 55. 55. 55.]
当第一个数组应返回True
时,由于所有值都在55到55.2之间,因此我得到的输出都是False
。
任何想法为何会这样?我在想这与比较两个数组并为两个数组返回相同值的语句有关。
答案 0 :(得分:3)
以自然语言使用时,您的逻辑是正确的,但在python中则不正确。 如果所有元素均为True,则返回True的“所有”方法, 如果任何元素为True,则“ any”方法将返回True。 表达您想要的东西的最短方法是
avgs = rotation / speed
if ((55 <= avgs) & (avgs <= 55.2)).all():
return True
return False
答案 1 :(得分:2)
如果您查看numpy.all()
的文档,则可以看到,如果所有元素都是True
,则其评估结果为True
:https://docs.scipy.org/doc/numpy/reference/generated/numpy.all.html
如果数组包含任何非零数字,则其计算结果为布尔值True
。因此,[55., 55., 55., 55., 55]
变成了[True, True, True, True, True]
,而[95., 55., 55., 55., 55]
变成了
相反,您可以执行以下操作:
if (np.all(avgs <= 55.2) and np.all(avgs >= 55)):
return False
elif (np.any(avgs >55.2) or np.any(avgs < 55)):
return True
答案 2 :(得分:2)
np.nadarray.all
的文档状态:
function containsString(array, string) {
var sorted = [...string].sort();
return array.some(s => [...s].sort().every(
(i => c => i = sorted.indexOf(c, i) + 1)(0)
));
}
console.log(containsString(['X', 'AB'], 'ACBC')); // true
console.log(containsString(['X', 'BA'], 'ACBC')); // true now
console.log(containsString(['X', '234', 'C'], 'ACBC')); // true
console.log(containsString(['X', 'CC'], 'ACBC')); // true
console.log(containsString(['X', 'BB'], 'ACBC')); // false
含义是该方法通常与布尔数组一起使用。如果 not 以此方式使用,您可能会发现由于该事实Returns True if all elements evaluate to `True`.
被认为0
和False
真而引起的各种意外后果:
1
一维数组与数字的比较运算符会自动生成布尔数组。您还可以使用np.arange(10).all() # False
np.ones(10).all() # True
np.zeros(10).all() # False
运算符组合 element-wise 的多个比较。因此,您可以重写逻辑:
&
请注意,这里不需要def foo(rotation, speed):
avgs = rotation / speed
return ((avgs >= 55) & (avgs <= 55.2)).all()
语句。 if
的结果是一个布尔值,即np.ndarray.all
或 True
。
此外,可以通过np.isclose
及其False
(“绝对公差”)参数来更简洁地编写逻辑:
atol