Heim >Backend-Entwicklung >Python-Tutorial >Wie kann ich mit Python effizient Entfernungen zwischen Millionen von Breiten-/Längengradkoordinaten in einem Pandas-Datenrahmen berechnen?

Wie kann ich mit Python effizient Entfernungen zwischen Millionen von Breiten-/Längengradkoordinaten in einem Pandas-Datenrahmen berechnen?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-02 03:46:30947Durchsuche

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

Schnelle Haversine-Approximation in Python/Pandas

Eine Herausforderung entsteht bei der Berechnung von Abständen zwischen Punktpaaren, die durch in a gespeicherte Breiten- und Längenkoordinaten dargestellt werden Pandas-Datenrahmen. Der naive Ansatz, jede Zeile mit einer Python-Schleife zu durchlaufen und die Haversinus-Formel anzuwenden, kann bei Millionen von Zeilen rechenintensiv sein. Eine Optimierung dieses Prozesses ist jedoch möglich.

Um eine schnellere Berechnung zu erreichen, können wir die Vektorisierung mit NumPy einsetzen. NumPy bietet Array-basierte Operationen, die die Leistung erheblich verbessern können, indem explizite Schleifen vermieden werden. Hier ist eine vektorisierte NumPy-Version der Haversinus-Funktion:

<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>

Hauptvorteile:

  1. Geschwindigkeit: Die vektorisierten Operationen von NumPy sind hoch optimiert und vermeidet den mit Schleifen verbundenen Overhead.
  2. Parallelisierung: NumPy unterstützt Parallelisierung, was die Berechnung auf Multi-Core-Systemen weiter beschleunigen kann.
  3. Prägnanz: Die vektorisierte Implementierung ist prägnanter und eleganter als die Schleifenversion.

Beispielverwendung:

<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>

Durch die Nutzung der Vektorisierungsfunktionen von NumPy wird es wird es möglich, Abstände zwischen Millionen von Punkten nahezu augenblicklich zu berechnen. Dieser optimierte Ansatz kann die Effizienz von Geoanalyseaufgaben in Python/Pandas erheblich verbessern.

Das obige ist der detaillierte Inhalt vonWie kann ich mit Python effizient Entfernungen zwischen Millionen von Breiten-/Längengradkoordinaten in einem Pandas-Datenrahmen berechnen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn