Numpy数组多条件布尔判断报错问题求助
问题分析与解决
你遇到的问题根源在于numpy数组不支持Python普通变量的链式比较语法,让我一步步拆解问题并给出解决方案:
为什么原来的写法不对?
在普通Python代码里,cond2 > A_1 < cond1会被自动解析成cond2 > A_1 and A_1 < cond1,这是Python的语法糖。但numpy数组的运算遵循元素级规则,它会把这个表达式生硬拆解成(cond2 > A_1) < cond1——也就是先计算cond2 > A_1得到一个布尔数组,再把这个布尔数组和cond1做比较。
拿你的代码举例:
cond2 = 30,A_1 = np.array([33,32,31]),所以cond2 > A_1得到的是array([False, False, False], dtype=bool)- 然后把这个布尔数组和
cond1=35比较时,布尔值会被自动转为0(False)和1(True),0 < 35的结果都是True,最终得到的数组完全不是你想要的“所有元素都在30和35之间”的判断结果。
正确的写法
要实现numpy数组的元素级双条件判断,需要用元素级逻辑与运算符&,并且给每个比较条件加上括号(避免运算符优先级干扰):
import numpy as np from collections import deque queue = deque([], maxlen=10) queue.appendleft(31) queue.appendleft(32) queue.appendleft(33) cond1 = 35 cond2 = 30 A_1 = np.array(queue) # 正确的双条件判断:每个元素大于cond2且小于cond1 valid = (A_1 > cond2) & (A_1 < cond1) print(valid) # 输出 array([ True, True, True], dtype=bool) # 检查是否所有元素都满足条件,转为int all_valid = (valid.sum() == A_1.size).astype(np.int) print(all_valid) # 输出 1
补充小提示
- 如果需要逻辑或判断,用元素级运算符
|;逻辑非用~ - 别用Python原生的
and/or/not,这些是针对整个数组的布尔判断,不是元素级的,会报错或者得到不符合预期的结果
内容的提问来源于stack exchange,提问作者Hsin
相关产品推荐
相关产品推荐

