使用 Numpy 矢量化在 Python/Pandas 中进行快速半正弦逼近
在处理涉及纬度和经度坐标的数百万个数据点时,使用以下方法计算距离半正矢公式可能非常耗时。本文提供了Haversine函数的矢量化Numpy实现,以显着提高性能。
原始Haversine函数:
原始Haversine函数是用Python编写的:
<code class="python">from math import radians, cos, sin, asin, sqrt def haversine(lon1, lat1, lon2, lat2): # convert decimal degrees to radians lon1, lat1, lon2, lat2 = map(radians, [lon1, lat1, lon2, lat2]) # haversine formula dlon = lon2 - lon1 dlat = lat2 - lat1 a = sin(dlat/2)**2 + cos(lat1) * cos(lat2) * sin(dlon/2)**2 c = 2 * asin(sqrt(a)) km = 6367 * c return km</code>
向量化 Numpy 半正弦函数:
向量化 Numpy 实现利用了 Numpy 优化的数组运算:
<code class="python">import numpy as np def haversine_np(lon1, lat1, lon2, lat2): lon1, lat1, lon2, lat2 = map(np.radians, [lon1, lat1, lon2, lat2]) dlon = lon2 - lon1 dlat = lat2 - lat1 a = np.sin(dlat/2.0)**2 + np.cos(lat1) * np.cos(lat2) * np.sin(dlon/2.0)**2 c = 2 * np.arcsin(np.sqrt(a)) km = 6378.137 * c return km</code>
性能比较:
矢量化 Numpy 函数可以立即处理数百万个输入点。例如,考虑随机生成的值:
<code class="python">lon1, lon2, lat1, lat2 = np.random.randn(4, 1000000) df = pandas.DataFrame(data={'lon1':lon1,'lon2':lon2,'lat1':lat1,'lat2':lat2}) km = haversine_np(df['lon1'],df['lat1'],df['lon2'],df['lat2'])</code>
使用原始 Python 函数需要花费大量时间的计算会立即完成。
结论:
使用 Numpy 对 Haversine 函数进行向量化可以显着提高大型数据集的性能。 Numpy 优化的数组运算可以高效处理多个数据点,减少计算开销并加快距离计算。这种优化使得对大规模数据集执行实时地理空间分析成为可能。
以上是如何在 Python 中有效计算数百万个数据点的半正矢距离?的详细内容。更多信息请关注PHP中文网其他相关文章!