Python NumPy数组多条件打印触发ValueError问题咨询
NumPy数组条件判断报错解决方案
问题背景
现有形状为(3,3,3)的NumPy数组A,需遍历三个维度为3x3的子数组A[0]、A[1]、A[2],规则为:
- 若子数组中至少存在1个元素满足
<=10或>=30,则打印该子数组 - 若子数组所有元素都在
(10,30)区间内,则打印STOP
初始代码运行时触发ValueError,无法正常执行。
初始错误代码
import numpy as np A=np.array([[[41,42,43],[44,45,46],[47,48,49]],[[11,12,13],[14,15,16],[17,18,19]], [[31,32,33],[34,35,36],[37,38,39]]]) for t in range(0,len(A)): if(A[t]<=10 or A[t]>=30): print(A[t]) else: print("STOP")
报错信息
in <module> if(A[t]<=10 or A[t]>=30): ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
错误原因
- 对NumPy数组执行
A[t]<=10、A[t]>=30这类比较操作,返回的是和原数组同形状的布尔数组,不是单个True/False值,Python原生的or关键字无法直接对多元素布尔数组做真值判断 - 需求中「至少有一个元素满足条件」的逻辑,需要显式调用NumPy数组的*
.any()*方法,将布尔数组聚合为单个布尔值才能传入if判断 - 针对NumPy数组的逐元素逻辑或运算,不能使用Python原生
or,需要用|运算符,且每个比较条件必须用括号包裹,避免运算符优先级导致逻辑错误
正确实现代码
import numpy as np A = np.array([ [[41,42,43],[44,45,46],[47,48,49]], [[11,12,13],[14,15,16],[17,18,19]], [[31,32,33],[34,35,36],[37,38,39]] ]) for sub_arr in A: # 逐元素判断两个条件,用|做逻辑或,最后用.any()判断是否存在符合条件的元素 if ((sub_arr <= 10) | (sub_arr >= 30)).any(): print(sub_arr) else: print("STOP")
运行结果
[[41 42 43] [44 45 46] [47 48 49]] STOP [[31 32 33] [34 35 36] [37 38 39]]
注:原问题附带的预期输出注释存在逻辑笔误:A[0]所有元素均>=30符合打印条件,A[1]所有元素在11-19区间无符合条件的元素因此打印STOP,A[2]所有元素均>=30同样符合打印条件。
内容的提问来源于stack exchange,提问作者Wiz123
相关产品推荐
相关产品推荐

