在Python中插入3D数据

时间:2016-01-04 11:45:16

标签: python numpy scipy interpolation

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

如何插入我的数据的每一层?

由于

2 个答案:

答案 0 :(得分:4)

  

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

您在f循环的每次迭代时都会覆盖插值for的值,所以当您完成i0f的循环时将仅对应data的最后一个Z平面。使用您当前的方法,您需要在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)

您可以通过同时插入所有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的坐标构建“开放网格”。

答案 1 :(得分:1)

目前,您正在为每个图层创建插值函数,然后在为下一个图层创建它之前将其抛弃。这就是为什么当你插入新网格时,只有最后一个仍被定义的原因。

如果i0正在索引每个"层"如果你的数据只是在每一层中进行插值,那么你肯定需要为每一层创建插值函数f,并在每次循环时相应地更新。类似下面的内容(请注意,rollaxis可能需要datanew才能按照您想要的顺序将其恢复原状:

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)