如何基于坐标在DataFrame中找到最近的人?距离矩阵优化问题
解决方法
问题核心是距离矩阵dm的对角线元素(个体到自身的距离)为0,导致argmin和min直接选中自身。只需将对角线元素替换为无穷大,就能让算法跳过自身,寻找其他个体中的最近者。
修改后的代码如下:
import numpy as np import pandas as pd from scipy.spatial.distance import cdist from haversine import haversine # 读取数据 df = pd.read_csv('../data/file_name.csv') df.set_index('Name', inplace=True) # 生成距离矩阵 dm = cdist(df, df, metric=haversine) # 将对角线(自身到自身的距离)设为无穷大,排除自身匹配 np.fill_diagonal(dm, np.inf) # 找到每个个体对应的最近个体索引和距离 closest_indices = dm.argmin(axis=1) min_distances = dm.min(axis=1) # 将结果映射回原DataFrame df['closest person'] = df.index[closest_indices] df['distance'] = min_distances # 查看结果 print(df)
关键说明
np.fill_diagonal(dm, np.inf):把距离矩阵中(i,i)位置的元素(即个体i到自身的距离)替换为无穷大,这样计算最小值时会自动跳过自身。- 注意
haversine默认接受(纬度, 经度)格式,你的DataFrame列顺序正好是Latitude、Longitude,无需调整坐标顺序。
额外优化(可选)
如果数据集非常大,生成完整距离矩阵会占用过多内存,可以改用sklearn.neighbors.NearestNeighbors只计算每个点的最近邻,节省资源:
from sklearn.neighbors import NearestNeighbors # 初始化近邻模型,找2个近邻(第一个是自身,取第二个) nn = NearestNeighbors(n_neighbors=2, metric=haversine) nn.fit(df) # 计算距离和索引,取第二个结果作为最近的其他个体 distances, indices = nn.kneighbors(df) df['closest person'] = df.index[indices[:,1]] df['distance'] = distances[:,1]
内容的提问来源于stack exchange,提问作者import_numpy
相关产品推荐
相关产品推荐

