问题描述
我收到了许多这样的数组:
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]