реплицируйте matlab interp3 в python, интерполируйте в неравномерно разнесенную матрицу

#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(:) , в numpy x_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))