簡體   English   中英

在Python中插入3D數據

[英]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循環,所以你的時間完成遍歷i0f將僅對應於最后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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM