2012-07-30 17 views
9

Ho una griglia regolare di valori di allenamento (i vettori xey con le rispettive griglie xmesh e ymesh e valori noti di zmesh) ma una sparsa/irregolare/gruppo irregolare di valori da interpolare (vettori xI e yI, dove siamo interessati a zI [0] = f (xI [0], yI [0]) ... zI [N-1] = f (xI [N -1], yI [N-1]). Questa interpolazione verrà chiamata milioni di volte come parte di un problema di ottimizzazione, quindi le prestazioni sono troppo importanti per utilizzare semplicemente un metodo che rende la griglia e prende la traccia.Interpolazione 2D veloce in Python con griglia regolare SciPy a valutazione sparsa/irregolare

Finora, sono riuscito a trovare una funzione scipy.interpolate che si avvicina a ciò che voglio, la funzione Bpf. Tuttavia, poiché racconta un input sparsi, presumo che non abbia una buona prestazione e io d li ke per testarlo contro i metodi di interpolazione spline, lineari e vicini più vicini, capisco meglio e mi aspetto che sarà più veloce. Tutti i metodi che implementano questi elementi che sono in grado di rilevare con griglie regolari come dati di allenamento (come RectBivariateSpline) sembrano richiedere anche griglie regolari per i valori da interpolare.

Questo codice si spera che chiarisca cosa sto chiedendo.

import numpy as np 
import scipy as sp 
import scipy.interpolate as interp 

x = np.arange(0,2*np.pi,.1) 
y = x 
xmesh,ymesh = np.meshgrid(x,y) 
zmesh = np.sin(xmesh)+np.cos(ymesh) 
rbf = interp.Rbf(xmesh, ymesh, zmesh, epsilon=2) 
xI = np.arange(0,np.pi,.05) 
yI = xI 
XI, YI = np.meshgrid(xI,yI) 
# Notice how this is happy to take a vector or grid as input 
zI = rbf(xI, yI) 
ZI = rbf(XI,YI) # equiv. to zImesh 
myspline = interp.RectBivariateSpline(x, y, zmesh) 
# myspline takes vectors as input but makes them into meshes for evaluation 
splineoutput = myspline(xI, yI) 
# myspline returns ZI but I want zI 
print(splineoutput) 
print(ZI) 
print(zI) 

C'è qualcosa che posso fare per utilizzare una funzione come RectBivariateSpline ma per ottenere Zi (vettore) invece di ZI (mesh)? Oppure, in alternativa, esiste un'altra famiglia di funzioni che funziona come preferisco con metodi di ottimizzazione alternativi e, in caso affermativo, che cosa dovrei cercare?

Solo un rapido promemoria che ciò che sto cercando è una tecnica di ottimizzazione rapida con array di dati relativamente grandi (oltre 20.000 voci), con piccole distanze tra i punti della griglia e dove i dati sono piuttosto fluidi. Sono sospetto che esista un modo semplice, semplice per fare ciò di cui ho bisogno con le librerie esistenti, ma non riesco a trovarlo. Grazie per l'aiuto.

risposta

2

Da v0.14.0 SciPy, RectBivariateSpline.__call__() prende un argomento grid= parola chiave opzionale che il valore predefinito è True:

griglia: bool

Sia per valutare i risultati su una griglia attraversato da gli array di input o i punti specificati dagli array di input.

Così si potrebbe usare:

splineoutput = myspline(xI, yI, grid=False)