2016-02-12 9 views
5

Sto utilizzando scipy.interpolate.interp2d per creare una funzione di interpolazione per una superficie. Quindi ho due array di dati reali per cui voglio calcolare i punti interpolati. Se passo i due array alla funzione interp2d ottengo una matrice di tutti i punti, non solo le coppie di punti.SciPy interp2D per coppie di coordinate

mia soluzione a questo è di comprimere le due matrici in una lista di coppie di coordinate e passare questo alla funzione di interpolazione in un ciclo:

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

mia domanda è, c'è un migliore (più elegante, Pythonico?) Modo di raggiungere lo stesso risultato?

risposta

1

Per uno, si può fare

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

nel vostro ciclo. O ancora meglio, solo

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

sostituzione del ciclo.

Su una nota diversa, I suggest using interpolate.griddata. Tende a comportarsi molto meglio di interp2d e accetta come punti di input punti di forma arbitraria. Come hai visto, gli interpolatori interp2d restituiranno solo i valori su una mesh.

+1

Grazie Andras, la lista comp funziona alla grande. Daremo un'occhiata alla griddata quando avrò più tempo - ho quello per cui ho bisogno di lavorare per ora, quindi posso guardare un po 'più tardi la velocità. Ben – BMichell

2

Prova * args ed imballaggio tuple/disimballaggio

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

o semplicemente

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

o semplicemente

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

come nota a margine, la "stella magica" permette zip essere il suo contrario!

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

Passare tutti i punti in una sola volta sarà probabilmente molto più veloce del loop su di essi in Python. È possibile utilizzare scipy.interpolate.griddata:

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

o uno degli scipy.interpolate.BivariateSpline classi, per esempio 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 funziona anche in modo simile, ma senza il parametro grid=False (ritorna sempre un'uscita 1D).