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