Fast 2 -D-интерполяция в Python с регулярной сеткой SciPy для рассеянной/нерегулярной оценки

У меня есть регулярная сетка обучающих значений (векторов x и y с соответствующими сетками xmesh и ymesh и известными значениями zmesh ), но разбросанная / рваная / нерегулярная группа значений для интерполяции (векторов xI и yI, где нас интересует zI[0] = f (xI[0],yI[0] )... zI[N -1] = f (xI[N -1],yI[N -1] ). Эта интерполяция будет вызываться миллионы раз как часть задачи оптимизации, поэтому производительность слишком важна, чтобы просто использовать метод, который создает сетку и берет трассировку.

До сих пор мне удалось найти одну функцию scipy.interpolate, которая близка к тому, что я хочу, функции Bpf. Однако из-за разрозненных входных данных я предполагаю, что у него не очень хорошая производительность, и я хотел бы проверить его на сплайн, линейный,и методы интерполяции ближайшего соседа я понимаю лучше, и я ожидаю, что они будут быстрее. Все методы, реализующие это, которые я смог найти и которые используют регулярные сетки в качестве обучающих данных (, такие как RectBivariateSpline ), также, по-видимому, требуют регулярных сеток для значений для интерполяции.

Надеюсь, этот код прояснит, о чем я прошу.

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)

Есть ли что-то, что я могу сделать, чтобы использовать такую ​​функцию, как RectBivariateSpline, но чтобы получить вектор zI ()вместо сетки ZI ()? Или, в качестве альтернативы, есть ли другое семейство функций, которое работает так, как я хочу, с альтернативными методами оптимизации, и если да, то что мне следует искать?

Просто краткое напоминание, что я ищу метод быстрой оптимизации с относительно большими массивами данных (20 000+ записей ), с небольшими расстояниями между точками сетки и где данные довольно гладкие. Я подозреваю, что есть хороший и простой способ сделать то, что мне нужно, с существующими библиотеками, но я не могу его найти. Спасибо вам за помощь.

9
задан BKay 8 April 2015 в 13:16
поделиться