如何检查数组的所有元素是否在两个值之间

时间:2018-10-06 17:47:21

标签: python arrays numpy

我有2个具有不同值的数组和一个if语句,这些语句根据数组中的值返回TrueFalse

代码:

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

任何想法为何会这样?我在想这与比较两个数组并为两个数组返回相同值的语句有关。

3 个答案:

答案 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,则其评估结果为Truehttps://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`. 被认为0False真而引起的各种意外后果:

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