如何使用复合条件生成的布尔数组对numpy数组进行过滤?
问题解决方法
你遇到的结果不符合预期的核心原因是:Python原生的and/or/not是用于布尔标量运算的逻辑运算符,无法对Numpy布尔数组做逐元素的逻辑判断。
正确写法
改用Numpy专属的逐元素逻辑运算符,且每个独立判断条件必须用小括号包裹,避免因运算符优先级问题得到错误结果:
- 多条件同时满足:用
&代替and - 满足任意一个条件:用
|代替or - 取反条件:用
~代替not
针对你给出的示例,修改后的代码如下:
import numpy as np verts = np.array([[1,2,3], [4,5,6], [7,8,9],]) # 每个条件加括号,用&做逐元素逻辑与 # 若要包含等于3的条目,将>改为>=即可匹配你给出的预期输出 cond = (verts[:,2] >= 3) & (verts[:,2] < 7) upper = verts[cond]
运行后得到的upper结果为:
array([[1, 2, 3], [4, 5, 6]])
你最开始提到的双重条件代码也对应修改为:
cond_upper = (verts[:,2] < L/2) & (verts[:,2] < 40.0) upper = verts[cond_upper]
内容的提问来源于stack exchange,提问作者eddy
相关产品推荐
相关产品推荐

