2016-02-12 18 views
5

Ich verwende scipy.interpolate.interp2d, um eine Interpolationsfunktion für eine Oberfläche zu erstellen. Ich habe dann zwei Arrays von realen Daten, für die ich interpolierte Punkte berechnen möchte. Wenn ich die beiden Arrays an die interp2d Funktion übergebe, bekomme ich eine Anordnung aller Punkte, nicht nur der Punktpaare.SciPy interp2D für Koordinatenpaare

zu Meine Lösung ist, die zwei Arrays in eine Liste von Koordinatenpaaren und geben diese an die Interpolationsfunktion in einer Schleife ZIP:

f_interp = interpolate.interp2d(X_table, Y_table,Z_table, kind='cubic') 

co_ords = zip(X,Y) 
out = [] 
for i in range(len(co_ords)): 
    X = co_ords[i][0] 
    Y = co_ords[i][1] 
    value = f_interp(X,Y) 
    out.append(float(value)) 

Meine Frage ist, gibt es eine bessere (elegantere, Pythonic?), Um das gleiche Ergebnis zu erzielen?

Antwort

1

Zum einen können Sie

for Xtmp,Ytmp in zip(X,Y): 
    ... 

in der Schleife tun. Oder noch besser, nur

out = [float(f_interp(XX,YY)) for XX,YY in zip(X,Y)] 

ersetzt die Schleife.

Auf eine andere Anmerkung, I suggest using interpolate.griddata stattdessen. Es verhält sich tendenziell besser als interp2d und akzeptiert willkürlich geformte Punkte als Eingabe. Wie Sie gesehen haben, geben interp2d Interpolatoren nur Werte auf einem Netz zurück.

+1

Dank Andras, die Liste Comp funktioniert gut. Ich werde mir Griddata ansehen, wenn ich mehr Zeit habe - ich habe, wofür ich jetzt arbeiten muss, kann mir ein bisschen später die Beschleunigung ansehen. Ben – BMichell

2

Try * args und Tupel Packen/Entpacken

points = zip(X, Y) 
out = [] 
for p in points: 
    value = f_interp(*p) 
    out.append(float(value)) 

oder nur

points = zip(X, Y) 
out = [float(f_interp(*p)) for p in points] 

oder nur

out = [float(f_interp(*p)) for p in zip(X, Y)] 

als eine Randnotiz, die "magische Stern" erlaubt zip sei sein eigenes Gegenteil!

points = zip(x, y) 
x, y = zip(*points) 
2

Es ist wahrscheinlich viel schneller, alle Punkte auf einmal zu übergeben, als in Python über sie zu laufen.

Z = interpolate.griddata((X_table, Y_table), Z_table, (X, Y), method='cubic') 

oder einer der scipy.interpolate.BivariateSpline Klassen, zum Beispiel: Sie könnten scipy.interpolate.griddata verwenden SmoothBivariateSpline:

itp = interpolate.SmoothBivariateSpline(X_table, Y_table, Z_table) 
# NB: choose grid=False to get an (n,) rather than an (n, n) output 
Z = itp(X, Y, grid=False) 

CloughTocher2DInterpolator arbeitet auch in ähnlicher Weise, aber ohne die grid=False Parameter (es gibt immer einen 1D-Ausgang).