如何使用NumPy数组的Vectorization来使用Geopy库为大型数据集计算测地距离?

我正在尝试从数据框计算测地距离,该数据框由四列纬度和经度数据组成,大约有300万行.我使用了apply lambda方法来完成任务,但是花了18分钟才完成任务.有没有办法使用Vectorization和NumPy数组来加速计算?谢谢你的回答.

我的代码使用apply和lambda方法:

from geopy import distance

df['geo_dist'] = df.apply(lambda x: distance.distance(
                              (x['start_latitude'], x['start_longitude']),
                              (x['end_latitude'], x['end_longitude'])).miles, axis=1)

更新:

我正在尝试这个代码,但它给了我错误:ValueError:具有多个元素的数组的真值是不明确的.使用a.any()或a.all().感谢是否有人可以提供帮助.

df['geo_dist'] = distance.distance(
                          (df['start_latitude'].values, df['start_longitude'].values),
                          (df['end_latitude'].values, df['end_longitude'].values)).miles

解决方法:

你的问题的答案:你无法做你想做的geopy.我不熟悉这个包,但是错误回溯显示此函数以及此包中可能的所有其他函数都没有考虑到矢量化计算而编写/设计.

现在,如果你可以做大圆距离,那么我建议你尝试使用astropy.coordinates软件包,我可以用矢量方式在点之间计算separations.

以下是基于我对其他问题的回答的示例:Finding closest point

from astropy.units import Quantity
from astropy.coordinates import SkyCoord, EarthLocation
from astropy.constants import R_earth
import numpy as np

lon1 = Quantity([-71.312796, -87.645307, -87.640426, -87.635513,
                 -87.630629, -87.625793 ], unit='deg')
lat1 = Quantity([41.49008, 41.894577, 41.894647, 41.894713,
                 41.894768, 41.894830], unit='deg')
lon2 = Quantity([-81.695391, -87.645307 + 0.5, -87.640426, -87.635513 - 0.5,
                 -87.630629 + 1.0, -87.625793 - 1.0], unit='deg')
lat2 = Quantity([41.499498, 41.894577 - 0.5, 41.894647, 41.894713 - 0.5,
                 41.894768 - 1.0, 41.894830 + 1.0], unit='deg')

pts1 = SkyCoord(EarthLocation.from_geodetic(lon1, lat1, height=R_earth).itrs, frame='itrs')
pts2 = SkyCoord(EarthLocation.from_geodetic(lon2, lat2, height=R_earth).itrs, frame='itrs')

然后,两组点之间的距离可以计算为:

>>> dist = pts2.separation(pts1)
>>> print(dist)
<Angle [ 7.78350849, 0.62435354, 0., 0.62435308, 1.25039805, 1.24353876] deg>

近似转换距离:

>>> np.deg2rad(pts2.separation(pts1)) * R_earth / u.rad
<Quantity [ 866451.17527216,  69502.31527953,      0.        ,
             69502.26348614, 139192.86680148, 138429.29874024] m>

将第一个值与geopy示例中的值进行比较:

>>> distance.distance((41.49008, -71.312796), (41.499498, -81.695391)).meters
866455.4329098687

编辑:实际上,这可能实际上可能会给你你所在的测地距离,但一定要检查the description of EarthLocation.

上一篇:Android将阿拉伯数字转换为英文数字


下一篇:Astar寻路算法C++实现