我有一个坐标列表,可以使用半径距离度量计算所有点之间的距离矩阵.
协调来作为一个numpy.array
形状(n, 2)
的(latitude, longitude)
对:
[[ 16.34576887 -107.90942116] [ 12.49474931 -107.76030036] [ 27.79461514 -107.98607881] ... [ 12.90258404 -107.96786569] [ -6.29109889 -107.88681145] [ -2.68531605 -107.72796034]]
我也可以沿着坐标序列隐含的路径提取距离,如下所示:
coordinates = np.deg2rad(coordinates) lat, lng = coordinates[:, 0], coordinates[:, 1] diff_lat = lat[:, None] - lat diff_lng = lng[:, None] - lng d = np.sin(diff_lat / 2) ** 2 + np.cos(lat[:, None]) * np.cos(lat) * np.sin(diff_lng / 2) ** 2 dist_matrix = 2 * 6371 * np.arcsin(np.sqrt(d)) np.diagonal(dist_matrix, offset=1) [ 428.51472359 1701.42935402 1849.52714339 12707.47743385 13723.9087041 4521.8250695 2134.258953 401.33113696 4571.69119707 73.82631307 6078.48898641 9870.17140175 ... 2109.57319898 12959.56540448 16680.64546196 3050.96912506 3419.95053226 4209.71641445 9467.85523888 2805.65191129 4120.18701177]
我想只计算距离向量而不是整个矩阵,然后选择相关的对角线.
这是一种可以在不创建大矩阵的情况下对该计算进行矢量化的方法. coslat
是纬度的余弦的阵列,并且coslat[:-1]*coslat[1:]
是表达COS(φ的矢量化版本1)COS(φ 2)在半正矢公式.
from __future__ import division, print_function import numpy as np def hav(theta): return np.sin(theta/2)**2 coords = [[ 16.34576887, -107.90942116], [ 12.49474931, -107.76030036], [ 27.79461514, -107.98607881], [ 12.90258404, -107.96786569], [ -6.29109889, -107.88681145], [ -2.68531605, -107.72796034]] r = 6371 coordinates = np.deg2rad(coords) lat = coordinates[:, 0] lng = coordinates[:, 1] coslat = np.cos(lat) t = hav(np.diff(lat)) + coslat[:-1]*coslat[1:]*hav(np.diff(lng)) d = 2*r*np.arcsin(np.sqrt(t)) print(d)
输出:
[ 428.51472353 1701.42935412 1655.91938575 2134.25895299 401.33113696]