应用多个条件来验证数组时出现问题?

问题描述

我收到了许多这样的数组:

arr1 = np.asarray([41,183,101,1607,70,137])

arr2 = np.asarray([300,250,300,17,190])

arr3 = np.asarray([41,10,60,1207,137])

我正在用这个函数验证:

def check(arr):
    if arr[ arr >= 90 ].size >= 4:
        return 'maybe'
    elif arr[ arr >= 250 ].size >= 4:
        return 'yes'
    elif arr[ arr < 90 ].size >= 4:
        return 'no'

我想申请的条件是,如果数组中至少有4个元素大于90,则返回"maybe",同时如果至少有4个元素大于250,则数组应该是"yes"。最后,如果少于 4 个元素大于 90,我应该返回 "no"

我尝试应用上述函数甚至 np.where。然而,该函数不适用于 arr2,因为它返回的是 maybe 而不是 yes在这些数组上检查多个条件的正确和 Pythonic(单行)方法是什么?

解决方法

一旦条件评估为 True,则不再评估其余条件。您需要切换前两个条件的顺序。

单线看起来如下:

def check(arr):
    return 'yes' if arr[ arr >= 250 ].size >= 4 else 'maybe' if arr[ arr >= 90 ].size >= 4 else 'no'

不过,将所有内容都放在一行上会违反 PEP-8,其中规定行的长度不应超过 80 个字符,因此不符合 Python 风格。

,

您的代码在编写时正在运行。您首先检查“可能”条件,arr2 符合条件:任何 >250 的元素也 >90。 如果可能,请重新安排您的条件,使其相互排斥,以避免出现此类问题。 如果您的条件不应该是相互排斥的,那么您有 2 个解决方法:1) 如果您希望 arr2(既是“是”又是“可能”)返回“是”,则测试“是” “条件在“可能”条件之前。 2) 测试每个条件并收集结果。我喜欢 2,所以它是这样的:

def ismaybe(arr): return arr[ arr >= 90 ].size >= 4
def isyes(arr): return arr[ arr >= 250 ].size >= 4
def isno(arr): return arr[ arr < 90 ].size >= 4
def check(arr): return {"maybe": ismaybe(arr),"yes": isyes(arr),"no":,isno(arr)}
,

单线:

def check(arr):
    return ['yes','maybe','no'][np.bincount(np.digitize(arr,[np.inf,250,90,-np.inf])).argmax()-1]

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...