从坐标列表中删除异常值

2024-05-14 01:18:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个带有十个坐标值的列表Xy

我还有两个额外的点异常值列表:异常值_x和异常值_y

我想检查我的X和Y列表,将它们的坐标与异常值进行比较,并创建新的2个列表(X_new和Y_new),其中包括没有异常值的点

在我堆叠的地方有我的嵌套循环。它只记录第一个点,模拟人生不会移动到下一个点。你能帮我修一下吗

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

Tags: 列表newlen地方记录dataset人生嵌套循环
3条回答

以下是基于@sin triba答案的工作解决方案:

X_new = []
y_new = []

for xi, yi in zip(X, y):
    x_is_valid = all([xi != ox  or xi == ox for ox in outlier_x])
    y_is_valid = all([yi != oy and yi != oy for oy in outlier_y])
    if x_is_valid and y_is_valid:
            X_new.append(xi)
            y_new.append(yi) 

解决方案

data[~np.isin(data, outliers).all(axis=1)]

台阶

从以下两个数据帧开始:

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()函数检查data中的任何行是否有与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

从那里,您可以使用xy列执行任何您喜欢的操作

替代解决方案,从1D阵列开始

如果您有单独的1D数组Xy,并且离群值也是如此,您可以将它们压缩到元组中,并将它们添加到集合中,然后从集合中减去离群值:

points = set(zip(X, y))
outliers = set(zip(outlier_x, outlier_y))
X_new, y_new = zip(*(points - outliers))
  • 编辑:抱歉,我不仅误解了你的问题,而且给了你一个糟糕的解决方案。既然您正在检查异常值中x,y坐标的相等性(与<{}相反),那么下面的方法应该有效
X = [0, 1, 4, 7, 11, 0, 1, 4, 7, 11]   
Y = [0.99844039, 2.188544418, 7.572173987, 6.138441957, 11.73792995, 1.043313797, 1.733181475, 7.424136351, 6.138441957, 9.73792995]
outlier_X = [4, 7, 11, 4, 7]
outlier_Y = [7.572173987, 6.138441957, 11.73792995, 7.424136351, 6.138441957]
final_X = [] 
final_Y = []
for xi, yi in zip(X, Y):

    is_valid = not any([xi == ox and yi== oy  for ox, oy in zip(outlier_X, outlier_Y)])
    if is_valid:
        final_X.append(xi)
        final_Y.append(yi)

print(final_X)
print(final_Y)

相关问题 更多 >