如何修复Python代码 从坐标列表X、y中剔除预定义异常值outliers
坐标异常点过滤代码修复方案
原代码问题梳理
- 计数器
n仅在循环外初始化一次,第一轮内层循环结束后n等于异常点列表长度,后续遍历其他坐标时内层循环不会执行,导致仅能处理第一个点 - 逻辑错误:当前只要坐标和某一个异常点不匹配就直接加入新列表,没有完成全量异常点比对,会导致异常点误加入
- 语法错误:
n+=缺失增量值,正确写法为n+=1 - 浮点数直接用
==比较存在精度风险,若后续数据集有精度误差建议用差值小于阈值的方式判断
修复方案
方案1:修改原循环逻辑
X = dataset.iloc[:, 1].values X = X.reshape(len(X),1) y = dataset.iloc[:, 2].values X_new = [] y_new = [] i = 0 while i < len(X): is_outlier = False n = 0 # 每次遍历新坐标时重置异常点计数器 while n < len(outlier_x): if (X[i] == outlier_x[n] and y[i] == outlier_y[n]): is_outlier = True break # 匹配到异常点直接跳出内层循环 n += 1 # 全量异常点比对完成后,确认不是异常点再加入新列表 if not is_outlier: X_new.append(X[i]) y_new.append(y[i]) i += 1
方案2:更简洁的集合判断方案(效率更高,无需嵌套循环)
X = dataset.iloc[:, 1].values # 若后续比较出现维度不匹配问题,可改为 X = dataset.iloc[:, 1].values.flatten() X = X.reshape(len(X),1) y = dataset.iloc[:, 2].values # 先把异常点转为元组集合,查询复杂度为O(1) outlier_set = set(zip(outlier_x, outlier_y)) X_new = [] y_new = [] for x_val, y_val in zip(X, y): if (x_val, y_val) not in outlier_set: X_new.append(x_val) y_new.append(y_val)
运行结果
按照给定的数据集和异常点列表,过滤后得到的X_new和y_new共包含5组有效坐标:
| x | y |
|---|---|
| 0.0 | 0.998440 |
| 1.0 | 2.188544 |
| 0.0 | 1.043314 |
| 1.0 | 1.733181 |
| 11.0 | 9.737930 |
内容的提问来源于stack exchange,提问作者Viki Liu
相关产品推荐
相关产品推荐

