应用多个条件来验证数组时出现问题?
Problems while applying multiple conditions to validate an array?
我收到了很多这样的数组:
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,return"maybe"
,同时如果至少有4个元素大于90大于 250 的数组应该是 "yes"
。最后,如果小于4的元素大于90,我应该return "no"
.
我尝试应用上述功能甚至np.where
。然而,该函数不适用于 arr2,因为它是 returning 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
,即“是”和“可能”,到 return“是”,那么在“可能”条件之前测试“是”条件。 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]
我收到了很多这样的数组:
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,return"maybe"
,同时如果至少有4个元素大于90大于 250 的数组应该是 "yes"
。最后,如果小于4的元素大于90,我应该return "no"
.
我尝试应用上述功能甚至np.where
。然而,该函数不适用于 arr2,因为它是 returning 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
,即“是”和“可能”,到 return“是”,那么在“可能”条件之前测试“是”条件。 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]