python - 如何使用带有 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
解决方案
我认为您可能会考虑为此使用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)
推荐阅读
- ffmpeg - 使用 ffmpeg/mp4box 从传输流 UDP 输入生成 mpeg-dash 实时内容
- php - 如果存在共同值,则将数组内的元素分组
- ios - 自动布局约束第一项和第二项如何工作?
- javascript - 如何在尝试下载图像之前快速回答是否预取图像
- javascript - 向 RGB 颜色混合算法添加额外的十六进制颜色
- vba - 移动图表
- c# - 从不同的测试项目运行多个使用 VS2017 构建的 C# 测试
- cookies - 在 PowerBI Desktop 中使用 Web.Contents 传递 Cookie
- apache-kafka - 我想在一段时间后停止@KafkaListener
- java - 如何使用java连接到中间有power broker的unix服务器