如何在 Python 中有效計算數百萬個資料點的半正矢距離?

Linda Hamilton
發布: 2024-11-03 00:25:02
原創
482 人瀏覽過

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>
登入後複製

效能比較:

效能比較:
<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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板