ホームページ  >  記事  >  バックエンド開発  >  Python を使用して Pandas データフレーム内の何百万もの緯度/経度座標間の距離を効率的に計算するにはどうすればよいですか?

Python を使用して Pandas データフレーム内の何百万もの緯度/経度座標間の距離を効率的に計算するにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-02 03:46:30838ブラウズ

How can I efficiently calculate distances between millions of latitude/longitude coordinates in a Pandas dataframe using Python?

Python/Pandas の高速ハーバーサイン近似

パンダのデータフレーム。 Python ループを使用して各行を反復処理し、ハバーサイン式を適用するという単純なアプローチでは、数百万行の場合に計算コストが高くなる可能性があります。ただし、このプロセスを最適化することは可能です。

より高速な計算を実現するには、NumPy を使用したベクトル化を採用できます。 NumPy は、明示的なループを回避することでパフォーマンスを大幅に向上できる配列ベースの操作を提供します。以下は、Haversine 関数のベクトル化された NumPy バージョンです:

<code class="python">import numpy as np

def haversine_np(lon1, lat1, lon2, lat2):
    """
    Calculate the great circle distance between two points on the earth (specified in decimal degrees).

    All args must be of equal length.
    """
    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>

主な利点:

  1. 速度: NumPy のベクトル化された演算は高度に高速です。
  2. 並列化: NumPy は並列化をサポートしており、マルチコア システムでの計算をさらに高速化できます。
  3. 簡潔性: ベクトル化された実装は、ループされたバージョンよりも簡潔で洗練されています。

使用例:

<code class="python">import numpy as np
import pandas

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'])

# Or, to create a new column for distances:
df['distance'] = haversine_np(df['lon1'],df['lat1'],df['lon2'],df['lat2'])</code>

NumPy のベクトル化機能を活用することで、数百万の点間の距離をほぼ瞬時に計算できるようになります。この最適化されたアプローチにより、Python/Pandas での地理空間分析タスクの効率が大幅に向上します。

以上がPython を使用して Pandas データフレーム内の何百万もの緯度/経度座標間の距離を効率的に計算するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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