我正在使用从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文件。
答案 0 :(得分:0)
我认为不可能避免循环,但由于你的网格是常规的(lon,lat),你可以使用documentation建议的更快RectBivariateSpline
。
此外,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
答案 1 :(得分:0)
也可以,您可以使用ESMpy来加快速度。
答案 2 :(得分:0)
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