簡體   English   中英

python中時間序列的二維網格插值

[英]2-D grid interpolation for time series in python

我正在處理源自 netCDF 文件的氣候數據。 來自不同模型的數據具有不同的分辨率 - 因此,有必要將模型“重新網格化”為共同的網格分辨率。 數據是 3-D(時間、緯度、經度)。 為了重新網格,我在每個時間步將舊網格線性插入到新網格上。

我正在尋找一種方法來提高循環每個時間步的過程的效率,因為scipy.interpolate.interp2d一次只能處理兩個維度。

有沒有什么方法可以在不執行for循環的情況下有效地對時間序列的兩個維度進行線性重新網格/插值(如下所示)?

import numpy as np
import xarray as xr

#create xarray DataArray to establish resolution we want to regrid to.
ref_lat = np.linspace(-90,89,180)
ref_lon = np.linspace(0,359,360)
ref_grid = xr.DataArray(np.zeros((180,360)),coords=[('lat',ref_lat),('lon',ref_lon)])
x_new = ref_grid.lon
y_new = ref_grid.lat

#original files and dimension
x_old = original_DataArray.lon
y_old = original_DataArray.lat
z_old = original_file #3-D memmap

fout = np.memmap('file_out',dtype='float32',mode='w+',shape=original_file.shape)
#any way to optimize this part??
for t in range(0,original_file.shape[0]):
    f = interpolate.interp2d(x_old,y_old,z_old[t,:,:])
    fout[t,:,:] = f(x_new,y_new)
fout.flush()

*注意:我使用 numpy memmaps 將文件寫入磁盤和從磁盤寫入文件,因為它們通常太大而無法在內存中處理,並且使用 xarray DataArrays 來處理 netCDF 文件。

我認為不可能避免循環,但是由於您的網格在 (lon, lat) 中是規則的,您可以按照文檔的建議使用更快的RectBivariateSpline

此外, xarray添加了一個額外的索引層,您的代碼不使用它,這可能會不必要地減慢速度。 特別是,如果您的數據存儲在文件中,則xarray可能僅在被要求xarray將其讀出。

例如,您可能會這樣做:

#original files and dimension
x_old = original_DataArray.lon.values
y_old = original_DataArray.lat.values
z_old = original_file.load().values

並將您的索引循環替換為:

for t, z in enumerate(z_old):
    # z is your 2d array, not sure if this loop is much faster though

另外,僅供參考,您可以使用ESMpy使其更快。

CDAT工具中有一個regrid()方法,可幫助插入到新網格上,而無需手動循環時間片。 您可以為函數提供要插入的目標網格:

var1_regrid = var1.regrid(ref_var.getGrid())
var2_regrid = var2.regrid(ref_var.getGrid())
var3_regrid = var3.regrid(ref_var.getGrid())

因此,它們可以進行如下計算:

diff = var1_regrid - ref_var

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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