2017-10-13 5 views
0

Ich habe verschiedene Möglichkeiten zum Abgleichen von Werten untersucht und bin mir nicht sicher, welche die beste Option in diesem Fall ist. Was ich habe, bin 1) und Eingangstabelle von 4 Spalten und 316 Zeilen: x, y, dx, dy:Vergleichen eines Werts aus einer Tabelle mit einer Reihe vorhandener Korrekturen (in einem Raster) nach Entfernung

-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 

My zweite Tabelle ist ein ähnliches Tier der Länge 529: index, Kx, Ky, KDX, 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 

Das Ziel ist, für jede der x, y (316 Punkte), würde Ich mag den nächsten Punkt Kx, Ky zu finden und eine Liste zurück, die x, y, dx, dy, Kx, Ky, Kdx, Kdy.

diese Dateien einlesen ich einen Abstand dmin erstellen können, die mit 316 Punkten ist lang:

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)) 

Allerdings, wenn ich versuche, XK, YK dxk zurückzukehren, DYK ich 316 Werte, die nur die Hälfte decken Bereich von der x, y ursprünglichen 316 Raster von Punkten.

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]) 

Ich habe bei Umsetzung in den Pandas sieht aus, als ich die Tische kommen könnte, wenn ich einen Index schreiben könnte, die bei Kx, Ky aktualisieren würde, wenn dmin wahr ist.

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) 

aber hier lief ich in Probleme, da ich nicht eine dKnn Spalte aus dem kleineren Datenrahmen definieren könnte.

Endlich habe ich die scipy.spatial.KDTree Routine durchsucht, aber da es so aussieht, als ob es nur ein einzelnes Array akzeptieren würde, war ich nicht in der Lage, einen passenden dxK, dyK zu finden. Es scheint, als ob der Pandas Datenrahmen der hoffnungsvollste Weg nach vorne ist, aber ich bin sehr steckengeblieben, so dass alle Vorschläge geschätzt werden.

+0

Ich bin ein wenig verwirrt über Ihr Problem. Könntest du das näher ausführen: Wenn ich versuche, xK, yK, dxK, dyK zurückzugeben, erhalte ich 316 Werte, die nur die Hälfte der Entfernung vom ursprünglichen, x, y 316 Gitter abdecken. –

Antwort

0

Es sieht so aus, als würden Sie einen k nearest neighbour-Klassifikator ausführen, wobei k=1 und die Anzahl der Klassen jede der 316 Zeilen ist.

Dieses Beispiel ist trivial wegen der geringen Anzahl von Beispielzeilen, die Sie gepostet haben, aber Sie können es leicht erweitern. Laden Sie zuerst die Daten in einen Pandas-Datenrahmen. (Sie werden von einer Datei lesen, aber für dieses Beispiel konstruiere ich sie von Hand).

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']) 

Jetzt können wir KNeighborsClassifier verwenden von Scikit-Learn. Wir setzen k gleich 1 (n_neighbors=1), da Sie nur den nächsten Punkt interessieren. Trainieren Sie das Modell für den ersten Datenrahmen, indem Sie den Zeilenindex als Klasse verwenden, und prognostizieren Sie dann die Punkte des zweiten Datenrahmens. Danach verschmelzen Sie einfach mit der vorhergesagten Klasse.

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 

Die Ausgabe hier ist ziemlich langweilig, weil alle Übereinstimmungen in der gleichen Zeile sind. Aber die Idee funktioniert.

Verwandte Themen