Maison >développement back-end >Tutoriel Python >Comment puis-je calculer efficacement les distances entre des millions de coordonnées latitude/longitude dans une trame de données Pandas à l'aide de Python ?

Comment puis-je calculer efficacement les distances entre des millions de coordonnées latitude/longitude dans une trame de données Pandas à l'aide de Python ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-02 03:46:30940parcourir

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

approximation rapide de Haversine en Python/Pandas

Un défi se pose lors du calcul des distances entre des paires de points représentés par des coordonnées de latitude et de longitude stockées dans un Cadre de données Pandas. L'approche naïve consistant à utiliser une boucle Python pour parcourir chaque ligne et à appliquer la formule haversine peut être coûteuse en calcul pour des millions de lignes. Cependant, l'optimisation de ce processus est possible.

Pour obtenir un calcul plus rapide, nous pouvons utiliser la vectorisation à l'aide de NumPy. NumPy fournit des opérations basées sur des tableaux qui peuvent améliorer considérablement les performances en évitant les boucles explicites. Voici une version NumPy vectorisée de la fonction haversine :

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

Principaux avantages :

  1. Vitesse : Les opérations vectorisées de NumPy sont hautement optimisé et évite les frais généraux associés au bouclage.
  2. Parallélisation : NumPy prend en charge la parallélisation, ce qui peut accélérer encore le calcul sur les systèmes multicœurs.
  3. Concision : L'implémentation vectorisée est plus concise et élégante que la version en boucle.

Exemple d'utilisation :

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

En exploitant les capacités de vectorisation de NumPy, il devient possible de calculer les distances entre des millions de points presque instantanément. Cette approche optimisée peut améliorer considérablement l'efficacité des tâches d'analyse géospatiale dans Python/Pandas.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn