Python修剪/过滤出点

Python修剪/过滤出点,python,Python,我有以下稳步增加的点数列表,例如: [[0, 0], [9, 4], [18, 19], [25, 34], [48, 48], [54, 53], [61, 65], [69, 82], [73, 86], [87, 99]] 但我碰巧遇到了一些违反此模式的点,正如您从下面的列表中所看到的: [526, 590], [532, 599], [605, 539], [740, 519], [753, 539], [858, 700], [981, 615], [985, 539], [1105

我有以下稳步增加的点数列表,例如:

[[0, 0], [9, 4], [18, 19], [25, 34], [48, 48], [54, 53], [61, 65], [69, 82], [73, 86], [87, 99]]
但我碰巧遇到了一些违反此模式的点,正如您从下面的列表中所看到的:

[526, 590], [532, 599], [605, 539], [740, 519], [753, 539], [858, 700], [981, 615], [985, 539], [1105, 700], [1222, 590], [1359, 343], [1456, 86], [1617, 4], [1790, 44], [1885, 1927], [2016, 2008]
因此,我需要找到一种方法来删减/过滤掉这些违反模式的点,在本例中是从
[605539]
[1790,44]

我尝试使用以下方法,仅接受y坐标位于上一点的y坐标和下一点的y坐标之间的点:

for i, pt in enumerate(points[1:-1]):
    x,y=cur_pt=points[i]
    x0,y0=prev_pt=points[i-1]
    x1,y1=next_pt=points[i+1]
    if y<y1 and y>y0:
        print 'acceptable point'
    else:
        print 'pruned'
我尝试使用以下方法,只接受y坐标位于前一点的y坐标和下一点的y坐标之间的点

用类似于…的东西检查x坐标不是更有意义吗

for i, pt in enumerate(points[1:-1]):
    x,y=cur_pt=points[i]
    x0,y0=prev_pt=points[i-1]
    x1,y1=next_pt=points[i+1]
    if y<y1 and y>y0 and x<x1 and x>x0:
        print 'acceptable point'
    else:
        print 'pruned'
对于枚举中的i,pt(点[1:-1]):
x、 y=电流=点[i]
x0,y0=上一个点[i-1]
x1,y1=下一个点[i+1]
如果yy0和xx0:
打印“可接受点”
其他:
打印“修剪”

您可以在第一次迭代中执行第二次迭代,从第一次迭代的索引开始。如果当前检查的变量(在迭代2中)小于第一次迭代的变量,则可以将其与布尔变量结合起来进行标记,如下所示:

#! /usr/bin/env python
points=points=[[0, 0], [9, 4], [18, 19], [25, 34], [48, 48], [54, 53], [61, 65], [69, 82], [73, 86], [87, 99], [93, 105], [96, 108], [98, 110], [99, 111], [100, 112], [106, 118], [119, 131], [128, 140], [134, 146], [137, 149], [139, 151], [140, 152], [141, 153], [147, 159], [160, 172], [185, 153], [213, 219], [215, 241], [219, 245], [223, 249], [236, 262], [247, 276], [249, 278], [274, 302], [282, 294], [288, 318], [313, 352], [365, 419], [377, 423], [416, 458], [435, 468], [468, 519], [481, 539], [508, 559], [526, 590], [532, 599], [605, 539], [740, 519], [753, 539], [858, 700], [981, 615], [985, 539], [1105, 700], [1222, 590], [1359, 343], [1456, 86], [1617, 4], [1790, 44], [1885, 1927], [2016, 2008], [2072, 2137], [2186, 2212], [2219, 2477], [2260, 2482], [2425, 2477], [2568, 2460], [2646, 2609], [2816, 2792], [2913, 2686], [2960, 2853], [3072, 2959], [3210, 2925], [3249, 2809], [3359, 2959], [3446, 3057], [3517, 2809], [3809, 2959], [4033, 3190], [4232, 3057], [4439, 2809], [4632, 3057], [4706, 2809], [4715, 1922], [4725, 1596], [5058, 1560], [5066, 1596], [5107, 1560], [5362, 1333], [5432, 1471], [5519, 1560], [5610, 1471], [5693, 249], [5782, 1471], [5968, 1560], [6068, 1471], [6105, 1560], [6298, 1700], [6390, 3765], [6416, 5926], [6446, 6440], [6503, 7300], [6511, 7332], [6522, 7342]]
accept=[]
for counter,i in enumerate(points): # Iteration 1
    y = i[1]
    flag = 0 # Set boolean to 0, indicating this value is still valid
    for j in points[counter:]: # Iteration2
        if int(j[1]) < y:
             flag = 1 # Set boolean to 1, indicating this value must be omitted
             break # No need to continue with iteration 2
    if flag == 0:
        accept.append(i)

我希望这就是你想要的?

谢谢大家的帮助,我刚刚发现我可以取平均y/x比(最大y坐标)/最大x坐标,在本例中约为1.1,并过滤掉y/x比远离该比的点:

valid=[v for v in points if (v[0]>0.9*v[1] and v[0]<1.5*v[1]) or v[0]==v[1]]

valid=[v表示点中的v,如果(v[0]>0.9*v[1]和v[0]都是独立增加的X和Y值,或者是否存在某种形式的相关性?在列表的开头和结尾应该发生什么?例如,如果
点[0]
的y值在列表中是最大的,你会放弃还是放弃列表中的其他部分?删除我的答案,因为我误解了。如果提供更多信息,我会发布一个新的答案。我认为他的列表已经根据X坐标排序,然后观察到一些y坐标的行为异常,但我可能弄错了。啊,他是专业的bably在迭代过程中修改列表,这会弄乱索引。是的,这就是为什么我的答案只是在新列表中添加正确的值,这似乎是最合乎逻辑的;)
#! /usr/bin/env python
points=points=[[0, 0], [9, 4], [18, 19], [25, 34], [48, 48], [54, 53], [61, 65], [69, 82], [73, 86], [87, 99], [93, 105], [96, 108], [98, 110], [99, 111], [100, 112], [106, 118], [119, 131], [128, 140], [134, 146], [137, 149], [139, 151], [140, 152], [141, 153], [147, 159], [160, 172], [185, 153], [213, 219], [215, 241], [219, 245], [223, 249], [236, 262], [247, 276], [249, 278], [274, 302], [282, 294], [288, 318], [313, 352], [365, 419], [377, 423], [416, 458], [435, 468], [468, 519], [481, 539], [508, 559], [526, 590], [532, 599], [605, 539], [740, 519], [753, 539], [858, 700], [981, 615], [985, 539], [1105, 700], [1222, 590], [1359, 343], [1456, 86], [1617, 4], [1790, 44], [1885, 1927], [2016, 2008], [2072, 2137], [2186, 2212], [2219, 2477], [2260, 2482], [2425, 2477], [2568, 2460], [2646, 2609], [2816, 2792], [2913, 2686], [2960, 2853], [3072, 2959], [3210, 2925], [3249, 2809], [3359, 2959], [3446, 3057], [3517, 2809], [3809, 2959], [4033, 3190], [4232, 3057], [4439, 2809], [4632, 3057], [4706, 2809], [4715, 1922], [4725, 1596], [5058, 1560], [5066, 1596], [5107, 1560], [5362, 1333], [5432, 1471], [5519, 1560], [5610, 1471], [5693, 249], [5782, 1471], [5968, 1560], [6068, 1471], [6105, 1560], [6298, 1700], [6390, 3765], [6416, 5926], [6446, 6440], [6503, 7300], [6511, 7332], [6522, 7342]]
accept=[]
for counter,i in enumerate(points): # Iteration 1
    y = i[1]
    flag = 0 # Set boolean to 0, indicating this value is still valid
    for j in points[counter:]: # Iteration2
        if int(j[1]) < y:
             flag = 1 # Set boolean to 1, indicating this value must be omitted
             break # No need to continue with iteration 2
    if flag == 0:
        accept.append(i)
[[0, 0], [9, 4], [1617, 4], [1790, 44], [5693, 249], [5782, 1471], [6068, 1471], [6105, 1560], [6298, 1700], [6390, 3765], [6416, 5926], [6446, 6440], [6503, 7300], [6511, 7332], [6522, 7342]]
valid=[v for v in points if (v[0]>0.9*v[1] and v[0]<1.5*v[1]) or v[0]==v[1]]