插入具有numpy和/ scipy的3D体积

use*_*295 19 python 3d interpolation numpy scipy

我非常沮丧,因为几个小时后我似乎无法在python中做一个看似简单的3D插值.在Matlab中我所要做的就是

Vi = interp3(x,y,z,V,xi,yi,zi)
Run Code Online (Sandbox Code Playgroud)

使用scipy的ndimage.map_coordinate或其他numpy方法,这相当于什么呢?

谢谢

Ste*_*nes 19

在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)
Run Code Online (Sandbox Code Playgroud)

这是一个完整的例子,展示了两者; 它将帮助您了解确切的差异......

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);
Run Code Online (Sandbox Code Playgroud)

结果是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))
Run Code Online (Sandbox Code Playgroud)

再一次,它[268,357].所以你看到一些细微的差别:Scipy使用x,y,z索引顺序,而MATLAB使用y,x,z(奇怪); 在Scipy中,你在一个单独的步骤中定义一个函数,当你调用它时,坐标分组如(x1,y1,z1),(x2,y2,z2),...而matlab使用(x1,x2,.. .),(Y1,Y2,...),(Z1,Z2,...).

除此之外,两者相似且同样易于使用.


buz*_*jwa 5

确切相当于MATLAB的interp3将使用SciPy的公司interpn进行一次性的插值:

import numpy as np
from scipy.interpolate import interpn

Vi = interpn((x,y,z), V, np.array([xi,yi,zi]).T)
Run Code Online (Sandbox Code Playgroud)

MATLAB和scipy的默认方法都是线性插值,可以使用method参数进行更改。请注意,interpn3维及以上尺寸仅支持线性和最近邻插值,而MATLAB也支持三次插值和样条插值。

在同一网格上进行多个插值调用时,最好使用插值对象RegularGridInterpolator,如上面接受的答案所示。内部interpn使用RegularGridInterpolator