基于坐标的最近点,python

closest points based on coordinates, python

我有一个带有 x 和 y 坐标的车站列表。我试图为每个站找到至少 4 个最近的点。我看过这个 但不知道该怎么做。

例如,我的数据如下:

station Y   X
601 28.47   83.43
604 28.45   83.42
605 28.16   83.36
606 28.29   83.39
607 28.38   83.36
608 28.49   83.53
609 28.21   83.34
610 29.03   83.53
612 29.11   83.58
613 28.11   83.45
614 28.13   83.42
615 282.4   83.06
616 28.36   83.13
619 28.24   83.44
620 28.02   83.39
621 28.23   83.24
622 28.09   83.34
623 29.06   84
624 28.58   83.47
625 28.54   83.41
626 28.28   83.36
627 28.23   83.29
628 28.3    83.18
629 28.34   83.23
630 28.08   83.37
633 29.11   83.59

我们将不胜感激任何帮助。

对于大数据,您可能会尝试在数据结构方面变得聪明。正如您自己所标记的那样,有专门的数据结构用于此类查找。 Scipy 支持一些,sklearn 甚至更完整(恕我直言,为这些任务 开发了更好更积极的 ;个人意见)!

代码示例使用 scipy 的 API 不使用 (python-) 循环。缺点是需要为每个元素丢弃到自身的 0 距离。

代码

import numpy as np
from scipy.spatial import KDTree

""" Data """
data_i = np.array([601, 604, 605, 606])
data = np.array([[28.47, 83.43],[28.45, 83.42],[28.16, 83.36],[82.29, 83.39]])
print(data_i)
print(data)

""" KDTree """
N_NEIGHBORS = 2
kdtree = KDTree(data)
kdtree_q = kdtree.query(data, N_NEIGHBORS+1)  # 0-dist to self -> +1
print(data_i[kdtree_q[1][:, 1:]])             # discard 0-dist
                                              #   uses guarantee of sorted-by-dist

输出

[601 604 605 606]
[[ 28.47  83.43]
 [ 28.45  83.42]
 [ 28.16  83.36]
 [ 82.29  83.39]]
[[604 605]
 [601 605]
 [604 601]
 [601 604]]