[英]Interpolation of 3D data in Python
我有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)
如何插入我的數據的每一層?
謝謝
我嘗試使用interp2D函數並遍歷各層,但f似乎只適用於i0的最后一個值。
您將要覆蓋插值,價值f
,您的每一次迭代for
循環,所以你的時間完成遍歷i0
值f
將僅對應於最后Z平面data
。 使用當前的方法,您需要在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
的坐標構造一個“開放網格”。
目前,您正在為每個圖層創建插值函數,然后在為下一個圖層創建它之前將其丟棄。 這就是為什么當你插入新網格時,只有最后一個仍然被定義。
如果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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.