首页  >  文章  >  后端开发  >  如何在 Python 中有效计算数百万个数据点的半正矢距离?

如何在 Python 中有效计算数百万个数据点的半正矢距离?

Linda Hamilton
Linda Hamilton原创
2024-11-03 00:25:02422浏览

How can I efficiently calculate Haversine distances for millions of data points in Python?

使用 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn