2012-07-30 38 views
9

Tengo una grilla regular de valores de entrenamiento (vectores x y y con grillas respectivas xmesh y ymesh y valores conocidos de zmesh) pero un disperso/desigual/grupo irregular de valores a interpolar (vectores xI y yI, donde estamos interesados ​​en zI [0] = f (xI [0], yI [0]) ... zI [N-1] = f (xI [N] -1], yI [N-1]). Esta interpolación se llamará millones de veces como parte de un problema de optimización, por lo que el rendimiento es demasiado importante simplemente para usar un método que hace la cuadrícula y toma la traza.Interpolación rápida en 2-D en Python con SciPy cuadrícula regular a evaluación dispersa/irregular

Hasta ahora, he podido encontrar una función de scipy.interpolate que se acerca a lo que quiero, la función Bpf. Sin embargo, como cuenta una entrada dispersa, supongo que no tiene un buen rendimiento y yo ' d li Para probarlo con los métodos de interpolación spline, lineal y de vecino más cercano, lo entiendo mejor y espero que sea más rápido. Todos los métodos que implementan estos que podría encontrar que toman las cuadrículas regulares como datos de entrenamiento (como RectBivariateSpline) también parecen requerir grillas regulares para que los valores se interpolen.

Espero que este código aclare lo que estoy pidiendo.

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) 

¿Hay algo que pueda hacer para utilizar una función como RectBivariateSpline pero para obtener zI (vector) en lugar de ZI (malla)? O, como alternativa, ¿existe otra familia de funciones que funcione de la manera que yo quiero en métodos de optimización alternativos? De ser así, ¿qué debería buscar?

Solo un rápido recordatorio de que lo que estoy buscando es una técnica de optimización rápida en matrices de datos relativamente grandes (más de 20,000 entradas), con distancias pequeñas entre puntos de la grilla, y donde los datos son bastante suaves. Sospecho que hay una buena y sencilla forma de hacer lo que necesito con las bibliotecas existentes, pero no puedo encontrarlo. Gracias por la ayuda.

Respuesta

2

De v0.14.0 scipy, RectBivariateSpline.__call__() toma un argumento opcional grid= palabra clave que por defecto es True:

rejilla: bool

Ya sea para evaluar los resultados en una cuadrícula atravesado por las matrices de entrada, o en los puntos especificados por las matrices de entrada.

lo que podría utilizar:

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