Поиск Ближайшего Соседа: Python

у меня есть 2-мерный массив:

MyArray = array([6588252.24, 1933573.3, 212.79, 0, 0],
                [6588253.79, 1933602.89, 212.66, 0, 0],
                 etc...)

первые два элемента MyArray[0] и MyArray[1] это X и Y координаты точек.

для каждого элемента в массиве, я хотел бы найти быстрый способ вернуть своего единственного ближайшего соседа в радиусе X единиц. Мы предполагаем, что это в 2D-пространстве.

давайте скажем для этого примера X = 6.

Я решил проблема в сравнении каждого элемента с каждым другим элементом, но это занимает 15 минут или около того, когда ваш список составляет 22k пунктов. Мы надеемся в конечном итоге запустить это в списках около 30 миллионов пунктов.

Я читал о деревьях K-d и понимаю основную концепцию, но у меня были проблемы с пониманием того, как их писать.

1 ответов


спасибо Джону Виньярду за предложение scipy. После некоторых хороших исследований и тестирования, вот решение этого вопроса:

предпосылки: Установить Numpy и SciPy

  1. импорт модулей SciPy и Numpy

  2. сделайте копию 5-мерного массива, включая просто значения X и Y.

  3. создать экземпляр cKDTree as такие:

    YourTreeName = scipy.spatial.cKDTree(YourArray, leafsize=100)
    #Play with the leafsize to get the fastest result for your dataset
    
  4. запрос cKDTree для ближайшего соседа в пределах 6 единиц как таковых:

    for item in YourArray:
        TheResult = YourTreeName.query(item, k=1, distance_upper_bound=6)
    

    для каждого элемента YourArray, TheResult будет кортежем расстояния между двумя точками и индексом местоположения точки в YourArray.