【问题标题】:Vectorize haversine distance computation along path given by list of coordinates沿由坐标列表给出的路径矢量化半正弦距离计算
【发布时间】:2016-04-05 18:30:56
【问题描述】:

我有一个坐标列表,可以使用haversine distance 度量计算所有点之间的距离矩阵。

坐标来自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]

我只想计算距离向量而不是整个矩阵,然后选择相关的对角线。

【问题讨论】:

    标签: python numpy vectorization distance haversine


    【解决方案1】:

    这是一种无需创建大矩阵即可对该计算进行矢量化的方法。 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]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-10-21
      • 2020-03-03
      • 1970-01-01
      • 1970-01-01
      • 2022-10-21
      • 1970-01-01
      • 2014-03-10
      • 1970-01-01
      相关资源
      最近更新 更多