<p>在scipy 0.14或更高版本中,有一个新函数<a href="https://docs.scipy.org/doc/scipy-0.18.0/reference/generated/scipy.interpolate.RegularGridInterpolator.html#scipy.interpolate.RegularGridInterpolator" rel="noreferrer">^{<cd1>}</a>与<code>interp3</code>非常相似。</p>
<p>MATLAB命令<code>Vi = interp3(x,y,z,V,xi,yi,zi)</code>将转换为如下内容:</p>
<pre><code>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)
</code></pre>
<p>这里有一个完整的例子来演示两者;它将帮助您理解它们之间的确切区别。。。</p>
<p>MATLAB代码:</p>
<pre><code>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);
</code></pre>
<p>结果是<code>Vi=[268 357]</code>,这确实是这两点的值<code>(2,6,8)</code>和<code>(3,5,7)</code>。</p>
<p>SCIPY代码:</p>
<pre><code>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))
</code></pre>
<p>又是<code>[268,357]</code>。所以你可以看到一些细微的差别:Scipy使用x,y,z索引顺序,而MATLAB使用y,x,z索引顺序(奇怪地);在Scipy中,你在单独的步骤中定义一个函数,当你调用它时,坐标被分组为(x1,y1,z1),(x2,y2,z2),。。。而matlab使用(x1,x2,…)(y1,y2,…)(z1,z2,…)。</p>
<p>除此之外,两者相似,同样易于使用。</p>