Python中的3D数据插值

4

我有一些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)

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

1
你对N的取值是多少? - DrBwts
N的值为64。 - Fred
2个回答

5
我试图使用interp2D函数并循环遍历各层,但似乎f仅适用于i0的最后一个值。你正在每次迭代for循环时覆盖插值器f的值,因此当您完成对i0值的循环时,f将仅对应于data的最后一个Z平面。使用您当前的方法,您需要在for循环内调用f,例如:
# 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)

您可以通过同时插值所有Z平面来消除for循环。一种方法是使用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)

在这里,我还使用np.ix_构建一个“开放网格”,从您想要进行插值的坐标中插值data


2

当前您正在为每个图层创建插值函数,然后在创建下一个函数之前将其丢弃。这就是为什么当您插值到新网格时只有最后一个被定义。

如果i0索引您的数据中的每个"层",并且您仅在每个层内插值,则肯定需要为每个层创建您的插值函数f,并在循环每次更新。类似以下内容(请注意,您可能需要对datanew进行rollaxis以按所需顺序排列):

import numpy as np
from scipy import interpolate

N = 64
data = np.random.random((21, 10, 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)
datanew = np.empty((N, 41, 20))
for i0 in np.arange(N):
    f = interpolate.interp2d(X, Y, data[:,:,i0].T, kind='linear')
    datanew[i0] = f(Ynew,Xnew)
datanew = np.rollaxis(datanew, 0, 3)

唯一的问题是每次我想要更改Xnew和Ynew时都需要进行插值。对于我的当前情况来说,这不是什么大问题,因为我的数据相对较小。谢谢。 - Fred
你可以存储一个插值对象列表,并通过索引 fi0 来使用它们。 - xnx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接