>  기사  >  백엔드 개발  >  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의 빠른 Haversine 근사치

팬더 데이터프레임. Python 루프를 사용하여 각 행을 반복하고 Haversine 공식을 적용하는 순진한 접근 방식은 수백만 행에 대해 계산 비용이 많이 들 수 있습니다. 하지만 이 프로세스를 최적화하는 것은 가능합니다.

더 빠른 계산을 달성하기 위해 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.