Python 应用多个条件验证阵列时出现问题?

Python 应用多个条件验证阵列时出现问题?,python,numpy,if-statement,list-comprehension,Python,Numpy,If Statement,List Comprehension,我收到了许多这样的阵列: arr1 = np.asarray([41, 183, 101, 1607, 70, 137]) arr2 = np.asarray([300, 250, 300, 17, 300, 190]) arr3 = np.asarray([41, 10, 60, 1207, 70, 137]) 我正在使用此函数验证: def check(arr): if arr[ arr >= 90 ].size >= 4: return 'mayb

我收到了许多这样的阵列:

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

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

arr3 = np.asarray([41, 10, 60, 1207, 70, 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,因为它返回的可能不是yes。检查这些数组上的多个条件的正确的、pythonic的一行方法是什么?

一旦一个条件的计算结果为True,其余条件将不再计算。您需要切换前两个条件的顺序

一个班轮的外观如下所示:

def checkarr: 如果arr[arr>=250,则返回'yes'。如果arr[arr>=90,则返回'maybe'。如果arr[arr>=90,则返回'maybe'。如果arr[arr>=4,则返回'no'
尽管如此,将所有内容都放在一行将违反PEP-8,其中规定行的长度不得超过80个字符,因此是非音速的。

您的代码正在按编写的方式工作。首先要检查maybe条件,arr2符合该条件:任何大于250的元素也都大于90。 如果可能,重新安排您的条件,使其相互排斥,以避免此类问题。 如果您的条件不应该是互斥的,那么您有两个修复:1如果您希望arr2(是和可能)返回yes,那么在可能条件之前测试yes条件。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]

有没有一个一行的解决方案?你是什么意思?比如列表理解或者类似的操作符,比如where for multiple condition,在一行中插入多个条件检查,用Python的one-line if-else语法是可行的。但这不是你现在绊倒的原因。你的条件不是相互排斥的;换句话说,数组中可能存在多个条件。arr2满足了可能和是。由于您测试了maybe first,if语句返回maybe。如果你愿意返回多个条件检查,我可以修改我的答案,向你展示类似的东西。那会有用的,我只是好奇一行解决方案任何数字>250也是>90;你无法到达你的“是”分支。把你的条件从最严格的重新安排到最不严格的。我知道有一个条件是无法达到的。这就是为什么我问是否有更好的方法来应用所有这些条件@PruneAlso,这个问题是可复制的,并且遵循社区的规则。既然给定的方法不起作用。。。是的,有更好的办法。正如我所说,重新安排条件。另外,您的final子句可以是一个简单的else,而不是一个多余的检查。是的,这可以在一行中完成:使用嵌套的三元运算符。但是,我认为您已经选择的格式更具可读性。是的,这就是此解决方案的问题所在,是否有允许我多次检查多个条件的运算符?请解释原因。我计划使用digitalize,但我不知道如何将arr中的元素与箱子中的连续对进行比较。第一个bin在np.inf和250之间,第二个在250和90之间,依此类推。