首页 > 解决方案 > 如何使用带有 NumPy 数组的矢量化来使用 Geopy 库为大型数据集计算测地线距离?

问题描述

我正在尝试计算一个数据帧的测地距离,该数据帧由四列纬度和经度数据组成,大约有 300 万行。我使用了 apply lambda 方法,但完成任务需要 18 分钟。有没有办法使用带有 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

标签: pythonnumpycoordinatesvectorizationgeopy

解决方案


我认为您可能会考虑为此使用geopandas它,它是 pandas 的扩展(因此numpy),旨在非常快速地进行这些类型的计算。

具体来说,它有一种计算 a 中点集之间距离的方法GeoSeries,它可以是 a 的列GeoDataFrame。我相当肯定这种方法numexpr可以用于矢量化。

它应该看起来像这样,您将数据框转换为GeoDataFrame具有(至少)两GeoSeries列可用于起点和终点的列。这应该返回一个GeoSeries对象:

import pandas as pd
import geopandas as gpd
from shapely.geometry import Point

geometry = [Point(xy) for xy in zip(df.longitude, df.latitude)]
gdf = gpd.GeoDataFrame(df, crs={'init': 'epsg:4326'}, geometry=geometry)

distances = gdf.geometry.distance(gdf.destination_geometry)

推荐阅读