print examples example python numpy scipy interpolation mesh

examples - python placeholder



Interpolación rápida en 2-D en Python con SciPy grid regular para evaluación dispersa/irregular (2)

Tengo una grilla regular de valores de entrenamiento (vectores xey con las respectivas grillas xmesh y ymesh y valores conocidos de zmesh) pero un grupo de valores dispersos / desiguales / irregulares para ser interpolados (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 para simplemente utilizar un método que hace la cuadrícula y toma el rastro.

Hasta ahora, he podido encontrar una función 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 me gustaría probarla contra 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.

Este código dejará claro lo que estoy preguntando.

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 usar 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 recordatorio rápido 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 los 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.


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

cuadrícula : bool

Si se deben evaluar los resultados en una cuadrícula abarcada por las matrices de entrada, o en los puntos especificados por las matrices de entrada.

Entonces podrías usar:

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