В SciPy 0,14 или более поздняя версия, есть новая функция scipy.interpolate.RegularGridInterpolator
который очень напоминает interp3
.
Команда MATLAB Vi = interp3(x,y,z,V,xi,yi,zi)
бы перевести на что-то вроде:
from numpy import array
from scipy.interpolate import RegularGridInterpolator as rgi
my_interpolating_function = rgi((x,y,z), V)
Vi = my_interpolating_function(array([xi,yi,zi]).T)
Вот полный пример, демонстрирующий, как; это поможет вам понять точные различия ...
MATLAB КОД:
x = linspace(1,4,11);
y = linspace(4,7,22);
z = linspace(7,9,33);
V = zeros(22,11,33);
for i=1:11
for j=1:22
for k=1:33
V(j,i,k) = 100*x(i) + 10*y(j) + z(k);
end
end
end
xq = [2,3];
yq = [6,5];
zq = [8,7];
Vi = interp3(x,y,z,V,xq,yq,zq);
Результат Vi=[268 357]
который действительно значение в этих двух точках (2,6,8)
и (3,5,7)
.
SciPy КОД:
from scipy.interpolate import RegularGridInterpolator
from numpy import linspace, zeros, array
x = linspace(1,4,11)
y = linspace(4,7,22)
z = linspace(7,9,33)
V = zeros((11,22,33))
for i in range(11):
for j in range(22):
for k in range(33):
V[i,j,k] = 100*x[i] + 10*y[j] + z[k]
fn = RegularGridInterpolator((x,y,z), V)
pts = array([[2,6,8],[3,5,7]])
print(fn(pts))
Опять же это [268,357]
. Итак, вы видите некоторые незначительные отличия: Scipy использует x, y, z индексный порядок, в то время как MATLAB использует y, x, z (странно); В Scipy вы определяете функцию на отдельном шаге, и когда вы ее вызываете, координаты группируются как (x1, y1, z1), (x2, y2, z2), ... тогда как в matlab используются (x1, x2, ... .), (у1, у2, ...), (z1, z2, ...).
Кроме этого, они похожи и одинаково просты в использовании.