2017-11-08 13 views
1

私は緯度と経度のポイント(apprx 1m)を持つデータフレームを持っています。nxnポイントの距離行列の計算を減らす

他のすべての点に対して各点のhaversine distanceを計算します。

例:

import haversine 

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

しかし、各ループのために、我々は以前より少ない1回の計算を必要とするように1mx1m演算を計算するように、例えば、センスをすることはありません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.  ]]) 
関連する問題