>  기사  >  백엔드 개발  >  Python에서 수백만 개의 데이터 포인트에 대한 Haversine 거리를 효율적으로 계산하려면 어떻게 해야 합니까?

Python에서 수백만 개의 데이터 포인트에 대한 Haversine 거리를 효율적으로 계산하려면 어떻게 해야 합니까?

Linda Hamilton
Linda Hamilton원래의
2024-11-03 00:25:02422검색

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

Numpy 벡터화를 사용하여 Python/Pandas에서 빠른 Haversine 근사

위도 및 경도 좌표와 관련된 수백만 개의 데이터 포인트를 처리할 때 다음을 사용하여 거리를 계산합니다. 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에서 수백만 개의 데이터 포인트에 대한 Haversine 거리를 효율적으로 계산하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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