【问题标题】:Large set of x,y coordinates. Efficient way to find any within certain distance of each other?大量 x,y 坐标。找到彼此一定距离内的任何有效方法?
【发布时间】:2019-07-04 02:13:26
【问题描述】:

我在 pandas 数据框中有大量数据点,其中的列包含这些点的 x/y 坐标。我想识别与数据框中任何其他点相距一定距离“d”的所有点。

我首先尝试使用“for”循环来执行此操作,检查第一个点与所有其他点之间的距离,然后检查第二个点与所有其他点之间的距离,等等。显然这对于​​大数据不是很有效放。

最近在线搜索表明最好的方法可能是使用 scipy.spatial.ckdtree,但我无法弄清楚如何实现这一点。我看到的大多数示例都针对单个 x/y 位置进行检查,而我想检查全部与全部。是否有人能够提供建议或示例,从我的数据框中获取的 x/y 坐标数组开始,如下所示:

points = df_sub.loc[:,['FRONT_X','FRONT_Y']].values  

看起来像这样:

[[19091199.587  -544406.722]
 [19091161.475  -544452.426]
 [19091163.893  -544464.899]
 ...
 [19089150.04   -544747.196]
 [19089774.213  -544729.005]
 [19089690.516  -545165.489]]

理想的输出将是彼此之间的截止距离“d”内的所有点对的 ID。

【问题讨论】:

标签: python pandas scipy


【解决方案1】:

scipy.spatial 有很多很好的函数来处理距离计算。

让我们创建一个包含 1000 个 (x, y) 点的数组 pos,类似于您的数据框中的内容。

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”内的所有点对的 ID”,如您所愿。

缺点

当然,这种方法有一个缺点,就是我们总是计算每个点到自身的距离(返回的距离为0),总是小于我们的阈值d。但是,我们可以使用以下软糖从ids 中排除自我比较:

pair_dist[np.r_[:num], np.r_[:num]] = np.inf
ids = np.argwhere(pair_dist < d)

另一个缺点是,当我们真正需要上三角或下三角成对距离矩阵时,我们会计算完全对称的成对距离矩阵。但是,除非这种计算确实是您代码中的瓶颈,否则我不会太担心这一点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-10
    • 2021-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多