我在Numpy数组中有一组(x; y)点,代表下面显示的曲线。我想检测并消除数组中破坏函数连续性的值。有可能吗?
修改 这是非期望值所在的函数的一组数据值。我手动定位,但这不是我需要的
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]
])
答案 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]
如果这两个都是假的,那么删除该点。