python - 从坐标列表中删除异常值
问题描述
我有 2 个列表X
和y
十个坐标值。
我还有 2 个额外的点异常值列表:outlier_x 和 outlier_y。
我想检查我的 X 和 Y 列表,将它们的坐标与异常值进行比较,并创建新的 2 个列表(X_new 和 y_new),其中将包括没有异常值的点。
我堆叠的地方有我的嵌套循环。它只记录第一个点,sims 不会移动到下一个点。你能帮忙修一下吗?
X = dataset.iloc[:, 1].values
X = X.reshape(len(X),1)
y = dataset.iloc[:, 2].values
X_new = []
y_new = []
i = 0
n = 0
while i < len(X):
while n < len(outlier_x):
if (X[i] == outlier_x[n] and y[i] == outlier_y[n]):
continue
X_new.append(X[i])
y_new.append(y[i])
n+=
i+=1
这是我的数据集:
x y
0 0.0 0.998440
1 1.0 2.188544
2 4.0 7.572174
3 7.0 6.138442
4 11.0 11.737930
5 0.0 1.043314
6 1.0 1.733181
7 4.0 7.424136
8 7.0 6.138442
9 11.0 9.737930
而这些点,之前已被确定为异常值:
x y
0 4.0 7.572174
1 7.0 6.138442
2 11.0 11.737930
3 4.0 7.424136
4 7.0 6.138442
解决方案
解决方案
data[~np.isin(data, outliers).all(axis=1)]
脚步
从这两个 DataFrame 开始:
In [3]: data
Out[3]:
x y
0 0.0 0.998440
1 1.0 2.188544
2 4.0 7.572174
3 7.0 6.138442
4 11.0 11.737930
5 0.0 1.043314
6 1.0 1.733181
7 4.0 7.424136
8 7.0 6.138442
9 11.0 9.737930
In [4]: outliers
Out[4]:
x y
0 4.0 7.572174
1 7.0 6.138442
2 11.0 11.737930
3 4.0 7.424136
4 7.0 6.138442
我们可以使用该np.isin()
函数检查 in 中的任何行data
是否具有与 in 中的任何行匹配的任何值outliers
:
In [5]: np.isin(data, outliers)
Out[5]:
array([[False, False],
[False, False],
[ True, True],
[ True, True],
[ True, True],
[False, False],
[False, False],
[ True, True],
[ True, True],
[ True, False]])
由于我们想要完全匹配(x 和 y 坐标),all()
因此沿第一个轴(跨列)使用:
In [6]: np.isin(data, outliers).all(axis=1)
Out[6]:
array([False, False, True, True, True, False, False, True, True,
False])
这个布尔掩码告诉我们哪些行与异常值完全匹配。我们需要做的就是反转掩码(因为我们要过滤异常值),并data
使用该掩码进行索引:
In [7]: data[~np.isin(data, outliers).all(axis=1)]
Out[7]:
x y
0 0.0 0.998440
1 1.0 2.188544
5 0.0 1.043314
6 1.0 1.733181
9 11.0 9.737930
x
从那里,您可以对和y
列做任何您喜欢的事情。
替代解决方案,从一维数组开始
如果您有单独的一维数组X
和y
,并且对于异常值也是如此,您可以将它们压缩成元组并将它们添加到一个集合中,然后从集合中减去异常值:
points = set(zip(X, y))
outliers = set(zip(outlier_x, outlier_y))
X_new, y_new = zip(*(points - outliers))
推荐阅读
- hibernate - Spring JPA:如何查看日志中发出的提交?
- java - 如何在没有重复数据的情况下在 Apache Pulsar 中进行集群切换
- dialogflow-es - Dialogflow Fulfillment:将多项选择题分解为单个问题
- angular - Angular 2+ Primeng + 下拉菜单 + 反应式表单
- php - 如何在codeigniter中获得3个单独列的总和
- r - 如何使用 R 更改选择集中的选择值?
- javascript - 如何在没有无限事件的情况下在两个滑块之间切换?
- go - Cond for 循环说明
- java - 带有扩展类型的 Java Lambda 函数
- mt4 - mt4 + ibarshift 给出不一致的结果