#matlab #multidimensional-array #scipy #interpolation
Вопрос:
Мне нужно воспроизвести конкретный случай функционирования MATLAB interp3
, который я не могу воспроизвести с помощью scipy.
У меня есть первое 3D-пространство, определенное как x
, y
, z
(сетки или векторы) и значения p
. Мне нужно интерполировать эти значения в новом 3D-пространстве, определяемом как x_new
, y
, z
. Для контекста x
, x_new
, y
, и z
являются матрицами 4999x84x83.
Проблема в том, что x_new
она меняется во всех направлениях, поэтому ее нельзя считать обычной сеткой или вектором.
Строка, которую мне нужно воспроизвести, выглядит следующим образом:
fn = interp3(y, x, z, p, y, x_new, z, 'linear');
В Python я попытался реализовать его, используя scipy как:
points = (x,y,z)
values = p
xi = (x_new,y,z)
fn = scipy.interpolate.interpn(points, values, xi, method='linear', bounds_error=True, fill_value=nan)
Или использовать griddata
в качестве:
fn = scipy.interpolate.griddata((x,y,z), p, (x_new,y,z), method='linear', fill_value=0, rescale=False)
Но оба метода приводят к ошибкам из-за неравномерного расстояния x_new
между матрицами.
Существует ли способ репликации interp3
функции в Python? Я могу предоставить вам доступ к данным, если вы хотите попробовать эту проблему из первых рук.
Комментарии:
1. при использовании
interp3
только первые 3 значения (те , которые определяют пространство) должны быть обычной сеткой, остальные-это просто отдельные комбинации точек (x,y,z). Это то же самое в python, просто введите туда 1D массивы, которые вы можете изменить позже.2. спасибо, Андер, вы правы, но моя проблема в том, что я не могу определить x_new как вектор, учитывая, что он меняется во всех 3 направлениях. В Matlab я могу напрямую вводить матрицу. Scipy требует векторов, как вы сказали, но я не могу представить x_new в виде вектора. Объясняет ли это больше мою ситуацию?
3. конечно, вы можете определить его как вектор, вы просто развернете его. в matlab,
x_new(:)
, в numpyx_new.ravel()
4. еще раз спасибо, Андер, с твоей помощью у меня все получилось. Знаете ли вы о какой-либо возможности ускорить интерполяцию или использовать графический процессор для этой задачи?
Ответ №1:
благодаря комментарию Андера теперь он работает так же, как Matlab. Подобный этому:
points = np.c_[(np.ravel(x_new), np.ravel(y), np.ravel(z))]
X, Y, Z = np.shape(p)
x_vect=x[:,0]
y_vect=y[:,0]
z_vect=z[:,0]
Vi = interpn((x_vect,y_vect,z_vect), p, points,bounds_error=False,fill_value=0, method='nearest')
Vi = np.reshape(Vi, (X, Y, Z))