ホームページ  >  記事  >  バックエンド開発  >  Python で数百万のデータポイントのハバーサイン距離を効率的に計算するにはどうすればよいですか?

Python で数百万のデータポイントのハバーサイン距離を効率的に計算するにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-03 00:25:02486ブラウズ

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

Numpy ベクトル化を使用した Python/Pandas の高速ハーバーサイン近似

緯度と経度の座標を含む数百万のデータ ポイントを処理する場合、次を使用して距離を計算します。 Haversine 式は時間がかかる場合があります。この記事では、パフォーマンスを大幅に向上させるための 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 Haversine 関数:

ベクトル化された 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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。