2017-11-08 21 views
1

위도와 경도 점 (apprx 1m)이있는 데이터 프레임이 있습니다.nxn 점에 대한 거리 행렬 계산 감소

다른 모든 점에 대해 각 점에 대한 haversine 거리를 계산하고 싶습니다.

예 :

import haversine 

lat1 = 40.5; lat2 = 42; long1 = -90; long2 = -93 
print(haversine.distance((lat1, long1), (lat2, long2))) 

그러나 1mx1m 연산을 계산하는 각 반복에 대해, 우리는 예로서 이전보다 1 연산을 필요로 이해되지 1에서 2까지의 거리가 1에서 2까지의 거리와 같습니다.

각 단계의 계산량을 줄이려면 어떻게해야합니까?

답변

0

사용 벡터화 방법 :

데모 :

In [105]: from sklearn.neighbors import DistanceMetric 

In [106]: dist = DistanceMetric.get_metric('haversine') 

In [107]: df 
Out[107]: 
    latitude longitude 
0 38.550420 -121.391416 
1 38.473501 -121.490186 
2 38.657846 -121.462101 
3 38.506774 -121.426951 
4 38.637448 -121.384613 

In [108]: earth_radius = 6371 
    ...: D = dist.pairwise(np.radians(df), np.radians(df)) * earth_radius 
    ...: 

In [109]: D 
Out[109]: 
array([[ 0.  , 12.12461135, 13.43188915, 5.75400608, 9.69511663], 
     [ 12.12461135, 0.  , 20.64315089, 6.63158885, 20.41101851], 
     [ 13.43188915, 20.64315089, 0.  , 17.07403265, 7.10128697], 
     [ 5.75400608, 6.63158885, 17.07403265, 0.  , 14.9892082 ], 
     [ 9.69511663, 20.41101851, 7.10128697, 14.9892082 , 0.  ]])