Быстрая двумерная интерполяция в 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 записей), с небольшими расстояниями между точками сетки и с довольно гладкими данными. Я подозреваю, что есть хороший и простой способ сделать то, что мне нужно, с существующими библиотеками, но я не могу его найти. Спасибо вам за помощь.


person BKay    schedule 30.07.2012    source источник


Ответы (2)


Это: http://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.RectBivariateSpline.ev.html

I.e. myspline.ev(xI, yI)

person pv.    schedule 30.07.2012
comment
Кажется, это именно то, что я хотел. Я знал, что есть что-то встроенное, чтобы помочь. Спасибо! - person BKay; 31.07.2012
comment
Также см. этот ответ для n-мерного случая: stackoverflow. ком/вопросы/16983843/ - person j13r; 20.09.2013

Из scipy v0.14.0, RectBivariateSpline.__call__() принимает необязательный аргумент ключевого слова grid=, который по умолчанию равен True:

сетка : bool

Нужно ли оценивать результаты в сетке, натянутой на входные массивы, или в точках, указанных входными массивами.

Итак, вы можете использовать:

splineoutput = myspline(xI, yI, grid=False)
person ali_m    schedule 25.11.2015