数组值在限定范围内却返回False?求排查及异常值索引方法
问题分析与解决
问题原因
你用y_array[:,[0]]取出来的是二维数组(形状为(n,1)),遍历这个数组时,每个value是长度为1的一维数组(比如[846.3]),而非单个数值。当你执行value > i and value < j时,实际是数组和标量做比较,得到的是布尔数组(比如[True]),all()函数会把这个布尔数组当作一个迭代元素,最终导致判断逻辑出错,返回False。
正确的范围检查方法
方法1:转为一维数组遍历
把y_array[:,[0]]改成y_array[:,0],这会取出一维数组(形状为(n,)),遍历时每个value就是单个数值:
import numpy as np # 加载数组 y_array = np.load('y_array.npy') i, j = 840, 940 # 正确遍历一维数组 res_teflon = all(value > i and value < j for value in y_array[:,0]) print("List contains all values in range : " + str(res_teflon))
方法2:用numpy向量操作(更高效)
numpy支持向量级别的比较,无需循环,性能更优:
import numpy as np y_array = np.load('y_array.npy') i, j = 840, 940 # 直接对数组做范围判断,再用all()确认 in_range = (y_array[:,0] > i) & (y_array[:,0] < j) res_teflon = in_range.all() print("List contains all values in range : " + str(res_teflon))
索引出不在范围内的值
用numpy的布尔索引可以快速筛选出不符合条件的元素:
import numpy as np y_array = np.load('y_array.npy') i, j = 840, 940 # 获取不在范围内的布尔掩码 out_of_range_mask = ~((y_array[:,0] > i) & (y_array[:,0] < j)) # 提取异常值 out_of_range_values = y_array[:,0][out_of_range_mask] print("不在范围内的值:", out_of_range_values)
如果要处理多个带不同限定范围的数组,可以封装成函数:
def check_and_get_outliers(arr, lower, upper): # 检查是否全部在范围内 all_in_range = ((arr > lower) & (arr < upper)).all() # 获取异常值 outliers = arr[~((arr > lower) & (arr < upper))] return all_in_range, outliers # 示例调用 y_col = y_array[:,0] all_in, outliers = check_and_get_outliers(y_col, 840, 940) print(f"全部在范围内:{all_in}") print(f"异常值:{outliers}")
内容的提问来源于stack exchange,提问作者Justin
相关产品推荐
相关产品推荐

