沿坐标列表给定的路径矢量化hasversine距离计算 [英] Vectorize haversine distance computation along path given by list of coordinates

查看:69
本文介绍了沿坐标列表给定的路径矢量化hasversine距离计算的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个坐标列表,可以使用 haversine距离指标.

I have a list of coordinates and can calculate a distance matrix among all points using the haversine distance metric.

坐标为(latitude, longitude)对的形状为(n, 2)numpy.array:

[[  16.34576887 -107.90942116]
 [  12.49474931 -107.76030036]
 [  27.79461514 -107.98607881]
 ...
 [  12.90258404 -107.96786569]
 [  -6.29109889 -107.88681145]
 [  -2.68531605 -107.72796034]]

我还可以像这样提取坐标序列所隐含的路径上的距离:

I can also extract the distance along the path implied by the sequence of coordinates like so:

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]

我只想计算相对于整个矩阵的距离矢量,然后选择相关的对角线.

I would like to only calculate the distance vector as opposed to the entire matrix and then selecting the relevant diagonal.

推荐答案

这是一种无需创建大型矩阵就可以将计算矢量化的方法. coslat是纬度余弦的数组,而coslat[:-1]*coslat[1:]是Haversine中表达式cos(ϕ 1 )cos(ϕ 2 )的向量化版本公式.

Here's one way you can vectorize that calculation without creating a big matrix. coslat is the array of cosines of the latitudes, and coslat[:-1]*coslat[1:] is the vectorized version of the expression cos(ϕ1)cos(ϕ2) in the Haversine formula.

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]

这篇关于沿坐标列表给定的路径矢量化hasversine距离计算的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆