scipy.spatial
имеет много хороших функций для обработки расстояний.
Давайте создадим массив pos
из 1000 (x, y) точек, аналогично тому, что у вас есть в вашем фрейме данных.
import numpy as np
from scipy.spatial import distance_matrix
num = 1000
pos = np.random.uniform(size=(num, 2))
# Distance threshold
d = 0.25
Здесь мы будем использовать distance_matrix
функция для расчета парных расстояний.Затем мы используем np.argwhere
, чтобы найти индексы всех парных расстояний, меньших некоторого порога d
.
pair_dist = distance_matrix(pos, pos)
ids = np.argwhere(pair_dist < d)
ids
теперь содержит "идентификаторы всех пар точек, которые находятся в пределах отсеченияРасстояние "D" друг от друга ", как вы хотели.
Недостатки
Конечно, у этого метода есть недостаток, заключающийся в том, что мы всегда вычисляем расстояние между каждой точкой и самой собой (возвращая расстояние 0
), которое всегда будет меньше нашего порогаd
.Однако мы можем исключить самосравнения из нашего ids
со следующей помадкой:
pair_dist[np.r_[:num], np.r_[:num]] = np.inf
ids = np.argwhere(pair_dist < d)
Другим недостатком является то, что мы вычисляем полную симметричную матрицу попарных расстояний, когда нам действительно нужен только верхний или нижний треугольник попарноматрица расстояний.Однако, если эти вычисления не являются узким местом в вашем коде, я бы не стал сильно беспокоиться об этом.