【发布时间】:2019-03-08 16:49:14
【问题描述】:
我正在使用 lat/long 填充一个大距离矩阵 (n=5000),并且正在寻找一种更快的方法来完成它。
示例代码
import pandas as pd
import numpy as np
# Calculate distance lat/long (Thanks @Jamie)
def spherical_dist(pos1, pos2, r=3958.75):
pos1 = np.array(pos1)
pos2 = np.array(pos2)
pos1 = pos1 * np.pi / 180
pos2 = pos2 * np.pi / 180
cos_lat1 = np.cos(pos1[..., 0])
cos_lat2 = np.cos(pos2[..., 0])
cos_lat_d = np.cos(pos1[..., 0] - pos2[..., 0])
cos_lon_d = np.cos(pos1[..., 1] - pos2[..., 1])
return r * np.arccos(cos_lat_d - cos_lat1 * cos_lat2 * (1 - cos_lon_d))
# Emtpy dataframe
dat = pd.DataFrame({'id': ['a', 'b', 'c', 'd'], 'lat': [-20, -21, -22, -24], 'lon': [-100, -101, -102, -103]})
dist_mat = pd.DataFrame(0, index=dat.id, columns=dat.id)
dist_mat
# Populate
for i in range(4):
for j in range(4):
dist_mat.iloc[i, j] = spherical_dist([dat.iloc[i, 1], dat.iloc[i, 2]], [dat.iloc[j, 1], dat.iloc[j, 2]])
输出
> dist_mat
id a b c d
id
a 0.000000 94.668315 189.039530 336.591787
b 94.668315 0.000000 94.373392 243.429659
c 189.039530 94.373392 0.000000 152.118003
d 336.591787 243.429659 152.118003 0.000000
【问题讨论】:
-
如果您将地球建模为一个球体,那么对于表面上的任何 2 个点,计算距离的公式应该是相同的。我认为您可以通过压缩 df 中的 2 列并应用公式来创建一系列(纬度、经度)坐标(希望可以简化为单行方程)。
标签: python pandas numpy distance