预期目标:两组数据(可以想象为两组格点),均包含经纬度信息,计算1组每个格点到2组每个格点距离。
法1:转为弧度制 * 地球半径 6371
得到的dist_matrix是一个二维数据,代表某点到某点的距离,比如第一行数据代表1组第一个格点到2组每个数据的距离(公里数)
# 将经纬度转换为弧度制
lat_rad = np.radians(disturbed_lats)
lon_rad = np.radians(disturbed_lons)
undisturbed_lat_rad = np.radians(undisturbed_lats)
undisturbed_lon_rad = np.radians(undisturbed_lons)
rad_dist_matrix = haversine_distances(np.vstack([lat_rad, lon_rad]).T,
np.vstack([undisturbed_lat_rad, undisturbed_lon_rad]).T)
dist_matrix = rad_dist_matrix * 6371
缺点:haversine_distances计算速度慢,遇到大量数据时,效率低下
大数据计算解决办法——见法2
法2:等同于法1,换一种计算方式,得到相同结果,计算速度大幅度提高
# 将经纬度转换为弧度制
lat_rad = np.radians(disturbed_lats)
lon_rad = np.radians(disturbed_lons)
undisturbed_lat_rad = np.radians(undisturbed_lats)
undisturbed_lon_rad = np.radians(undisturbed_lons)
def haversine_distances_fast(X, Y):
# convert decimal degrees to radians
# haversine formula
dlon = Y[:, 1] - X[:, 1][:, np.newaxis]
dlat = Y[:, 0] - X[:, 0][:, np.newaxis]
a = np.sin(dlat/2)**2 + np.cos(X[:, 0])[:, np.newaxis] * np.cos(Y[:, 0]) * np.sin(dlon/2)**2
c = 2 * np.arcsin(np.sqrt(a))
km = 6367 * c
return km
dist_matrix = haversine_distances_fast(np.vstack([lat_rad, lon_rad]).T,
np.vstack([undisturbed_lat_rad, undisturbed_lon_rad]).T)
法3:以上计算得到的均为距离,同样也能得到欧氏距离
# 将经纬度转换为弧度制
lat_rad = np.radians(disturbed_lats)
lon_rad = np.radians(disturbed_lons)
undisturbed_lat_rad = np.radians(undisturbed_lats)
undisturbed_lon_rad = np.radians(undisturbed_lons)
def euclidean_distances_fast(X, Y):
# convert decimal degrees to radians
# X = np.radians(X)
# Y = np.radians(Y)
# euclidean formula
dlon = Y[:, 1] - X[:, 1][:, np.newaxis]
dlat = Y[:, 0] - X[:, 0][:, np.newaxis]
km = 6373 * np.sqrt(dlon**2 + dlat**2)
return km
dist_matrix = euclidean_distances_fast(np.vstack([lat_rad, lon_rad]).T,
np.vstack([undisturbed_lat_rad, undisturbed_lon_rad]).T)
参考文献:
sklearn.metrics.pairwise.haversine_distances-scikit-learn中文社区
scikit-learn - sklearn.metrics.pairwise.haversine_distances 计算样本 X 和 Y 之间的 Haversine 距离。