2017-10-13 13 views
0

私は値を一致させるいくつかの方法を検討してきましたが、この場合に最適なオプションが何であるか分かりません。私は4列と316行の1)と入力テーブルである持っているもの:X、Y、DX、DY:インデックスのとき、Kx、Kyの、KDX:テーブルからの値を距離による既存の修正(グリッド上)のセットと一致させる

-233200.0 -233200.0 -19.4 21.4 
-212000.0 -233200.0 -23.7 23.8 
-190800.0 -233200.0 -26.8 26.4 
-169600.0 -233200.0 -39.0 33.5 
-148400.0 -233200.0 -39.0 33.5 
-127200.0 -233200.0 -46.0 38.4 
-106000.0 -233200.0 -47.2 38.2 
-84800.0 -233200.0 -49.3 38.8 
-63600.0 -233200.0 -50.8 35.8 
-42400.0 -233200.0 -49.4 32.1 

私の2番目の表は、長さ529の同様の獣でありますKdy:

1 -3995 213531 -44.1 32.7 
    2 -25446 213433 -48.6 37.0 
    3 -3175 169047 -44.7 19.7 
    4  -831 40968 -8.7 -15.1 
    5 -2771 147269 -33.1 1.3 
    6 -43705 82864 3.5 -5.3 
    7 -24925 191012 -46.2 30.4 
    8 -25982 236253 -58.1 48.8 
    9 -46318 191012 -48.2 31.2 

目標は、xのそれぞれに対して、Y(316ポイント)、私は、最も近い点Kxのを見つけたいケンタッキーとX、Y、DX、DYあるリストを返したい、ですKx、Ky、Kdx、Kdy。

私は316ポイント長い距離dminと作成することができ、これらのファイルを読む:私は返すようにしようとした場合、

dmin=[] 
for i in range(len(xf)): 
    for y in range(len(xK)): 
     dist=np.sqrt((x[i]-xK[y])*(x[i]-xK[y])+(y[i]-yK[y])*(y[i]-yK[y])) 
    dmin.append(np.min(dist)) 

しかしをXK、YK、dxK、DYK私は半分だけをカバーする316個の値を取得します元の316グリッドの点のx、yからの範囲です。

for i in range(len(xf)): 
    for y in range(len(xKnn)): 
     dist=np.sqrt((x[i]-xK[y])*(x[i]-xK[y])+(y[i]-yK[y])*(y[i]-yK[y])) 
    dmin.append(np.min(dist)) 
    ymatch.append(yKnn[i]) 
    xmatch.append(xKnn[i]) 
    dxmatch.append(dxKnn[i]) 
    dymatch.append(dyKnn[i]) 

私はdminのが真であるときKxと、ケンタッキー州で更新してしまうのインデックスを作成することができれば、私はテーブルを結合する可能性があるのでパンダにこれを入れて見てきました。

d={'x': x, 'y': y, 'dx': dx, 'dy': dy} 
df=pd.DataFrame(data=d) 

dKnn={'xK': xK, 'yK': yK, 'dxK': dxK, 'dyK': dyK} 
dfKnn=pd.DataFrame(data=dKnn) 

しかし、ここで私は小さなデータフレームからdKnn列を定義できないため、問題が発生しました。

最後に私はscipy.spatial.KDTreeルーチンを検索していましたが、1つの配列だけを受け入れるように設計されているように、一致するdxK、dyKを返す方法を見つけることができませんでした。パンダのデータフレームが最も有望な方法だと思われますが、私は非常に固執していますので、どんな提案も感謝しています。

+0

私はあなたの問題について少し混乱しています。しかし、私がxK、yK、dxK、dyKを返そうとすると、元の316グリッドの点の半分をカバーする316の値が得られます。 –

答えて

0

k最近傍分類器を実行しているようです。ここでは、k=1であり、クラス数は316行です。

この例は、あなたが投稿した例題の行が少ないので簡単ですが、簡単に拡張することができます。まず、パンダのデータフレームにデータをロードします。 (ファイルから読み込みますが、この例では手作業で構築しています)。

import pandas as pd 

s1 = '''-233200.0 -233200.0 -19.4 21.4 
-212000.0 -233200.0 -23.7 23.8 
-190800.0 -233200.0 -26.8 26.4 
-169600.0 -233200.0 -39.0 33.5 
-148400.0 -233200.0 -39.0 33.5 
-127200.0 -233200.0 -46.0 38.4 
-106000.0 -233200.0 -47.2 38.2 
-84800.0 -233200.0 -49.3 38.8 
-63600.0 -233200.0 -50.8 35.8 
-42400.0 -233200.0 -49.4 32.1'''.split('\n') 

s2 = ''' 1 -3995 213531 -44.1 32.7 
    2 -25446 213433 -48.6 37.0 
    3 -3175 169047 -44.7 19.7 
    4  -831 40968 -8.7 -15.1 
    5 -2771 147269 -33.1 1.3 
    6 -43705 82864 3.5 -5.3 
    7 -24925 191012 -46.2 30.4 
    8 -25982 236253 -58.1 48.8 
    9 -46318 191012 -48.2 31.2'''.split('\n') 

df1 = pd.DataFrame([list(map(float, x.split())) for x in s1], 
    columns=['x','y','dx','dy']) 

df2 = pd.DataFrame([list(map(float, x.split())) for x in s2], 
    columns=['i','kx','ky','kdx','kdy']) 

ここでは、scikit-learnのKNeighborsClassifierを使用できます。最も近い点だけを気にするので、kを1(n_neighbors=1)に設定します。クラスとして行インデックスを使用してモデルを最初のデータフレームでトレーニングし、次に2番目のデータフレームのポイントを予測します。その後、予測クラスをマージします。

from sklearn.neighbors import KNeighborsClassifier 

knn = KNeighborsClassifier(n_neighbors=1) 
knn.fit(df1[['x','y']], df1.index) 
closest_index = knn.predict(df2[['kx','ky']]) 

# assign the closest index to df2 
df2['closest_df1'] = closes_index 

# merge the two dataframes, drop the useless columns 
pd.merge(df1, df2, left_index=True, right_on='closest_df1').drop(
    ['i','closest_df1'], axis=1) 

# returns: 
     x   y dx dy  kx  ky kdx kdy 
0 -42400.0 -233200.0 -49.4 32.1 -3995.0 213531.0 -44.1 32.7 
1 -42400.0 -233200.0 -49.4 32.1 -25446.0 213433.0 -48.6 37.0 
2 -42400.0 -233200.0 -49.4 32.1 -3175.0 169047.0 -44.7 19.7 
3 -42400.0 -233200.0 -49.4 32.1 -831.0 40968.0 -8.7 -15.1 
4 -42400.0 -233200.0 -49.4 32.1 -2771.0 147269.0 -33.1 1.3 
5 -42400.0 -233200.0 -49.4 32.1 -43705.0 82864.0 3.5 -5.3 
6 -42400.0 -233200.0 -49.4 32.1 -24925.0 191012.0 -46.2 30.4 
7 -42400.0 -233200.0 -49.4 32.1 -25982.0 236253.0 -58.1 48.8 
8 -42400.0 -233200.0 -49.4 32.1 -46318.0 191012.0 -48.2 31.2 

すべての一致が同じ行にあるため、ここの出力はかなり退屈です。しかし、そのアイデアは機能します。

関連する問題