Удалить точку из списка, если в пределах определенного порога любой другой точки - PullRequest
0 голосов
/ 26 апреля 2018

У меня есть код, который фильтрует точки из списка, где расстояние между ними меньше 3:

import numpy
lst_x = [0,1,2,3,4,5,6,7,8,9,10]
lst_y = [9,1,3,2,7,6,2,7,2,3,8]
lst = numpy.column_stack((lst_x,lst_y))

diff = 3

new = []
for n in lst:
    if not new or ((n[0] - new[-1][0]) ** 2 + (n[1] - new[-1][1]) ** 2) ** .5 >= diff:
    new.append(n)

Проблема в том, что на выходе получаются:

[array([0, 9]), array([1, 1]), array([4, 7]), array([6, 2]), array([7, 7]), array([8, 2]), array([10,  8])]

точка [6,2] и [8,2] ближе чем 3 друг к другу, но они находятся в результатах, я думаю, это потому, что цикл for проверяет только одну точку, а затем переходит на следующую.

Как я могу проверить это?все числа в каждой точке.

1 Ответ

0 голосов
/ 26 апреля 2018

Ваш алгоритм очень тщательно сравнивает только с точкой, последней добавленной в список, new[-1].Этого недостаточно.Вам нужен еще один цикл, чтобы убедиться, что вы проверяете по каждому элементу new.Как то так:

for n in lst:
    too_close = False
    for seen_point in new:  
        # Is any previous point too close to this one (n)?
        if not new or ((n[0] - seen_point[0]) ** 2 +     \
                       (n[1] - seen_point[1]) ** 2) ** .5 < diff:
            too_close = True
            break

    # If no point was too close, add this one to the "new" list.
    if not too_close:
        new.append(n)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...