Python新手求助:如何查找路径点到另一路径的最近点及距离?
找每个点的最近邻点及距离解决方案
步骤1:导入依赖库并加载数据
先确保你已经安装了pandas和numpy,如果没装可以在Jupyter里用!pip install pandas numpy安装。
加载CSV并提取坐标数组:
import pandas as pd import numpy as np # 加载两个数据集 df1 = pd.read_csv('dataset1.csv') # 替换成你的数据集1文件名 df2 = pd.read_csv('dataset2.csv') # 替换成你的数据集2文件名 # 提取X、Y坐标为numpy数组 points1 = df1[['X', 'Y']].values # 假设CSV列名为X和Y,不是的话改成你的列名 points2 = df2[['X', 'Y']].values
步骤2:计算所有点对的距离并找最近邻
用numpy的广播特性一次性计算所有点之间的欧氏距离,再快速找出每个点1对应的最近点2:
# 计算点1到所有点2的欧氏距离矩阵 # 形状为 (点1数量, 点2数量) distances = np.linalg.norm(points1[:, np.newaxis] - points2, axis=2) # 找出每个点1对应的最小距离和点2的索引 min_distances = np.min(distances, axis=1) # 每个点1的最近距离 closest_point_indices = np.argmin(distances, axis=1) # 对应点2在df2中的索引
步骤3:将结果合并到原数据集
把最近点的坐标和距离添加到df1中,方便查看:
# 把最近点的X、Y坐标和距离加入df1 df1['closest_X'] = df2.loc[closest_point_indices, 'X'].values df1['closest_Y'] = df2.loc[closest_point_indices, 'Y'].values df1['min_distance'] = min_distances # 查看结果 print(df1.head())
补充说明
- 如果你的CSV列名不是
X和Y,记得把代码里的列名替换成实际名称。 - 如果数据集特别大(比如超过10万条数据),上面的方法可能会占用较多内存,这时可以用
sklearn.neighbors.KDTree来优化,示例代码如下:
from sklearn.neighbors import KDTree # 构建KDTree tree = KDTree(points2) # 查询每个点1的最近邻(k=1表示找最近的1个点) min_distances, closest_point_indices = tree.query(points1, k=1) # 注意这里min_distances是二维数组,需要转成一维 min_distances = min_distances.flatten() closest_point_indices = closest_point_indices.flatten() # 后续合并步骤和上面一样
内容的提问来源于stack exchange,提问作者Andrew Lindsay
相关产品推荐
相关产品推荐

