python numpy检测并消除不需要的值

时间:2015-11-18 20:16:04

标签: python numpy

我在Numpy数组中有一组(x; y)点,代表下面显示的曲线。我想检测并消除数组中破坏函数连续性的值。有可能吗?

enter image description here

修改 这是非期望值所在的函数的一组数据值。我手动定位,但这不是我需要的

set_of_data = np.array([
     [ 0.01099914,  0.1990088 ],
     [ 0.00235953,  0.20015288],
     [-0.00628651,  0.20127308],
     [-0.01493928,  0.20236874],
     [-0.02359911,  0.20343921],
     [-0.0322663,   0.20448377],
     [-0.04094121,  0.20550169],
     [-0.04962419,  0.20649219],
     [-0.0583156,   0.20745447],
     [-0.06701583,  0.20838767],
     [-0.07572529,  0.20929091],
     [-0.0844444,   0.21016325],
     [-0.09317361,  0.21100373],
     [-0.10191339,  0.2118113 ],
     [-0.11066424,  0.21258489],
     [-0.11942668,  0.21332338],
     [-0.12820128,  0.21402557],
     [-0.13698863,  0.2146902 ],
     [-0.10507277,  0.20535413],   #<-- point to remove
     [-0.14749565,  0.21590372],
     [-0.15646386,  0.2164481 ],
     [-0.16552084,  0.21694332],
     [-0.17466738,  0.2173836 ],
     [-0.18390426,  0.21776298],
     [-0.19323216,  0.21807525],
     [-0.20265175,  0.21831395],
     [-0.21216362,  0.21847237],
     [-0.2217683,  0.21854352],
     [-0.23146627,  0.21852011],
     [-0.24125792,  0.21839456]
 ])

2 个答案:

答案 0 :(得分:4)

这是一种相当强大的方法:

for i in range(1, len(data) - 1):
    backward_angle = np.arctan2(data[i][1] - data[i - 1][1], data[i][0] - data[i - 1][0])
    forward_angle = np.arctan2(data[i + 1][1] - data[i][1], data[i + 1][0] - data[i][0])
    angle_difference = (backward_angle - forward_angle + np.pi) % (2 * np.pi) - np.pi
    if np.absolute(angle_difference) > np.pi / 2:
        print "Outlier:", data[i]

它计算从前一点到当前点以及从当前点到下一点的方向。如果差值(模2 pi)大于pi / 2(即90度),则检测到异常值。

输出:

Outlier: [-0.13698863  0.2146902 ]
Outlier: [-0.10507277  0.20535413] 

请注意,检测到两个点,因为方向有两处变化。

答案 1 :(得分:3)

你如何循环内部行,检查x [i]是否在x [i-1]和x [i + 1]之间;还检查y [i]是否在y [i-1]和y [i + 1]之间。

您需要同时检查

的情况

z [i-1]&lt; z [i]&lt; Z [I + 1] 和 z [i + 1]&lt; z [i]&lt; Z [I-1]

如果这两个都是假的,那么删除该点。