2016-12-02 12 views
0

私は数ヶ月間、地理座標上の類似性について複数のテーブルを分析するプログラムを書く方法について何ヶ月も演奏してきました。私はネストされたfor-loopsから現在KD-Treeを使っていますが、これはうまく動作しているようです。この場合には、私の第三次元に読んだとき、私はそれが正しく機能していることを確認していないしかし、あなたは、私が最初に単一ユニットとして(x、y)の位置を計算しています見ることができるようにZ.KDツリーのZディメンションを読む

import numpy 
from scipy import spatial 
import math as ma 

def d(a,b): 
d = ma.acos(ma.sin(ma.radians(a[1]))*ma.sin(ma.radians(b[1])) 
      +ma.cos(ma.radians(a[1]))*ma.cos(ma.radians(b[1]))*(ma.cos(ma.radians((a[0]-b[0]))))) 
return d 

filename1 = "A" 
pos1 = numpy.genfromtxt(filename1, 
       skip_header=1, 
       usecols=(1, 2)) 
z1 = numpy.genfromtxt(filename1, 
       skip_header=1, 
       usecols=(3)) 
filename2 = "B" 
pos2 = numpy.genfromtxt(filename2, 
       #skip_header=1, 
       usecols=(0, 1)) 
z2 = numpy.genfromtxt(filename2, 
       #skip_header=1, 
       usecols=(2)) 

filename1 = "A" 
data1 = numpy.genfromtxt(filename1, 
       skip_header=1) 
       #usecols=(0, 1)) 
filename2 = "B" 
data2 = numpy.genfromtxt(filename2, 
        skip_header=1) 
        #usecols=(0, 1) 
tree1 = spatial.KDTree(pos1) 

match = tree1.query(pos2) 
#print match 
indices_pos1, indices_pos2 = [], [] 
for idx_pos1 in range(len(pos1)): 
    # find indices in pos2 that match this position (idx_pos1) 
    matching_indices_pos2 = numpy.where(match[1]==idx_pos1)[0] 

    for idx_pos2 in matching_indices_pos2: 
     # distance in sph coo 
     distance = d(pos1[idx_pos1], pos2[idx_pos2]) 

     if distance < 0.01 and z1[idx_pos1]-z2[idx_pos2] > 0.001: 
      print pos1[idx_pos1], pos2[idx_pos2], z1[idx_pos1], z2[idx_pos2], distance 

として定義されます球座標で測定される。 file1の各要素はfile2の各要素と比較されます。問題はZ次元のどこかにありますが、私はこの問題を解消することはできません。結果がプリントアウトされるとき、Z座標はしばしば互いに近くにない。あたかも私のプログラムがそのことを完全に無視しているようです。以下は、Z値が実際には非常に離れているという問題を示すデータから一連の結果を投稿したものです。

[ 358.98787832 -3.87297365] [ 358.98667162 -3.82408566] 0.694282 0.5310796 0.000853515096105 
[ 358.98787832 -3.87297365] [ 359.00303872 -3.8962745 ] 0.694282 0.5132215 0.000484847441066 
[ 358.98787832 -3.87297365] [ 358.99624509 -3.84617685] 0.694282 0.5128636 0.000489860962243 
[ 359.0065807 -8.81507801] [ 358.99226267 -8.8451829 ] 0.6865379 0.6675241 0.000580562641945 
[ 359.0292886  9.31398903] [ 358.99296163 9.28436493] 0.68445694 0.45485374 0.000811677349685 

アウトプットが構造化された方法:あなたが見ることができるように[POSITION1は(x、y)は] [POSITION2(x、y)は] [Z1] [Z2]は、最後に具体的には、

を遠ざけます例えば、Z座標は約.23で精算されます。上の例で入力した.001の制限を超えています。

あなたが共有できる洞察は、本当に素晴らしいでしょう!

答えて

0

元の問題については、という記号がという単純な問題があります。 z1-z2 > 0.001の場合はテストしますが、おそらくabs(z1-z2) < 0.001が必要です(>の代わりに<が表示されます)。

また、z座標を考慮してツリーを作成し、(x、y、z)だけでなく、(x、y)としてデータを与える必要があります。 z値がわからない場合は使用できません。

座標範囲とz範囲を独立してバインドしたウィンドウをツリーに直接照会することは可能です(ただし、Sklearn APIはこれを許可しません)。 x、y、zの拡張子が異なるボックスを考えてみましょう。しかし、zは異なる値の範囲を持つため、これらの異なるスケールを組み合わせることは困難です。

k-d-treeが球面座標を知らないことに注意してください。 +180度の点と-180度の点 - または0点と360点 - はk-d-treeにとって非常に遠いが、球面距離に非常に近い。だから、いくつかの点を欠場するでしょう!

+0

返信いただきありがとうございます!私はこれを投稿する前に<記号を変更しているはずです。私は以前のものをちょうど回っていた。 私が一番上に置いた球面座標の定義は、3D空間で読み取ることができないというKDツリーの問題を考慮していませんか?そうでなければ、私はどのような種類のエラーバーを期待しているのか分かりませんか? –

+0

最後のビットを考えると、これはもうこれ以上最善の方法であることはかなり不確実で、一般的には次に試すものを失うことになります。私は球座標で約100万の座標を2つの別々のテーブルを横断して分析するために実装できるものについて何か推奨していますか? –

+0

dの条件は「欠落」ポイントに役立ちません。あなたが3つのユークリッド空間(球の表面上の点)にそれらを投影すると、k-d-treeは合理的に良いかもしれません。測地距離の指標を検索することができます。 –

関連する問題