Python 中 3D 数据的插值

Fre*_*red 4 python interpolation numpy scipy

我有 3D 数据。我想逐层(在平面 X,Y 上)插入这些数据,因为计算每一层都需要很多时间。

我尝试使用 interp2D 函数并循环遍历各层,但 f 似乎仅适用于 i0 的最后一个值。

X = np.linspace(10., 15., 21)
Y = np.linspace(0.05, 1.85, 10)
for i0 in np.arange(N):
    f = interpolate.interp2d(X, Y, data[:,:,i0], kind='linear')

Xnew = np.linspace(10., 15., 41)
Ynew = np.linspace(0.05, 1.85, 20)
datanew = f(Xnew,Ynew)
Run Code Online (Sandbox Code Playgroud)

如何对数据的每一层进行插值?

谢谢

ali*_*i_m 5

我尝试使用 interp2D 函数并循环遍历各层,但 f 似乎仅适用于 i0 的最后一个值。

f您将在循环的每次迭代中覆盖插值 的值for,因此当您完成循环时,i0f将仅对应于 的最后一个 Z 平面data。使用当前的方法,您需要在循环f内调用for,例如:

# some example data for test purposes
N = 64
data = np.random.randn(10, 21, N)

X = np.linspace(10., 15., 21)
Y = np.linspace(0.05, 1.85, 10)
Xnew = np.linspace(10., 15., 41)
Ynew = np.linspace(0.05, 1.85, 20)

# initialize output array
datanew = np.empty((Ynew.shape[0], Xnew.shape[0], N), data.dtype)

for i0 in np.arange(N):
    f = interpolate.interp2d(X, Y, data[:,:,i0], kind='linear')

    # fill in this Z-slice
    datanew[:,:,i0] = f(Xnew,Ynew)
Run Code Online (Sandbox Code Playgroud)

您可以for通过同时在所有 Z 平面上进行插值来消除环路。一种方法是使用scipy.interpolate.RegularGridInterpolator

from scipy.interpolate import RegularGridInterpolator

Z = np.arange(N)

itp = RegularGridInterpolator((Y, X, Z), data, method='linear')

grid = np.ix_(Ynew, Xnew, Z)
datanew2 = itp(grid)
Run Code Online (Sandbox Code Playgroud)

在这里,我还使用np.ix_您想要插值的坐标构造“开放网格” data