Поиск Ближайшего Соседа: 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
импорт модулей SciPy и Numpy
сделайте копию 5-мерного массива, включая просто значения X и Y.
-
создать экземпляр
cKDTree
as такие:YourTreeName = scipy.spatial.cKDTree(YourArray, leafsize=100) #Play with the leafsize to get the fastest result for your dataset
-
запрос
cKDTree
для ближайшего соседа в пределах 6 единиц как таковых:for item in YourArray: TheResult = YourTreeName.query(item, k=1, distance_upper_bound=6)
для каждого элемента
YourArray
,TheResult
будет кортежем расстояния между двумя точками и индексом местоположения точки вYourArray
.