私は数ヶ月間、地理座標上の類似性について複数のテーブルを分析するプログラムを書く方法について何ヶ月も演奏してきました。私はネストされた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の制限を超えています。
あなたが共有できる洞察は、本当に素晴らしいでしょう!
返信いただきありがとうございます!私はこれを投稿する前に<記号を変更しているはずです。私は以前のものをちょうど回っていた。 私が一番上に置いた球面座標の定義は、3D空間で読み取ることができないというKDツリーの問題を考慮していませんか?そうでなければ、私はどのような種類のエラーバーを期待しているのか分かりませんか? –
最後のビットを考えると、これはもうこれ以上最善の方法であることはかなり不確実で、一般的には次に試すものを失うことになります。私は球座標で約100万の座標を2つの別々のテーブルを横断して分析するために実装できるものについて何か推奨していますか? –
dの条件は「欠落」ポイントに役立ちません。あなたが3つのユークリッド空間(球の表面上の点)にそれらを投影すると、k-d-treeは合理的に良いかもしれません。測地距離の指標を検索することができます。 –