NumPy使用&运算筛选多数组时报tuple类型不支持操作错误
问题背景
尝试基于两个NumPy数组筛选取值均等于1的对应元素,运行代码触发报错,待筛选的两个数组形态参考:
原错误代码:
ip_zr = np.where((cicep == 1, 1, cicep) & (cfzra == 1, 1, cfzra))
抛出错误:
TypeError: unsupported operand type(s) for &: 'tuple' and 'tuple'
错误诱发原因
- 语法结构写错:混淆了
np.where的参数格式,np.where(condition, x, y)的三个参数是直接传给函数的,错误地把「判断条件、满足条件填充值、不满足条件填充值」三个内容用括号包裹成了Python原生元组,放在了本该写判断条件的位置。 - 运算对象类型不匹配:
(cicep == 1, 1, cicep)和(cfzra == 1, 1, cfzra)都是tuple(元组)类型,Python中元组不支持&(按位与)运算,因此直接抛出类型错误。
正确修改方案
根据实际需求选对应写法即可:
- 如果仅需要获取两个数组同时等于1的位置索引:
# 注意每个独立判断条件必须单独加圆括号,避免运算优先级错误 ip_zr_index = np.where((cicep == 1) & (cfzra == 1))
- 如果需要直接获取两个数组同时为1位置的元素值,用布尔索引更简洁:
ip_zr_value = cicep[(cicep == 1) & (cfzra == 1)]
- 如果需要生成和原数组同形状的新数组,两个数组同时为1的位置填1,其余位置保留
cicep的原有值(从原代码写的参数推断的常见需求),正确传参给np.where即可:
ip_zr = np.where( (cicep == 1) & (cfzra == 1), # 第一参数:逐元素判断条件 1, # 第二参数:条件为True时的填充值 cicep # 第三参数:条件为False时的填充值 )
注意:NumPy数组做逐元素多条件组合判断时,不能用Python原生的and/or关键字,必须用&(逻辑与,多条件同时满足)、|(逻辑或,满足任意一个条件),且每个独立的比较判断语句必须用圆括号单独包裹,否则会因为运算优先级问题触发逻辑错误或报错。
内容的提问来源于stack exchange,提问作者Wx_Trader
相关产品推荐
相关产品推荐

