我在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。
答案 0 :(得分:2)
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)
另一个缺点是,当我们仅真正需要上三角三角形对距离矩阵或下三角三角形对距离矩阵时,我们将计算整个对称的成对距离矩阵。但是,除非这种计算确实是您代码中的瓶颈,否则我不会对此太担心。