python中时间序列的二维网格插值
我正在处理来自netCDF文件的气候数据。来自不同模型的数据具有不同的分辨率-因此,有必要将模型“重新划分”为公共网格分辨率。数据是三维的(时间、纬度、经度)。为了重新网格化,我在每个时间步将旧网格线性插值到新网格上 我正在寻找一种方法来提高循环通过每个时间步的过程的效率,因为python中时间序列的二维网格插值,python,scipy,spatial-interpolation,python-xarray,Python,Scipy,Spatial Interpolation,Python Xarray,我正在处理来自netCDF文件的气候数据。来自不同模型的数据具有不同的分辨率-因此,有必要将模型“重新划分”为公共网格分辨率。数据是三维的(时间、纬度、经度)。为了重新网格化,我在每个时间步将旧网格线性插值到新网格上 我正在寻找一种方法来提高循环通过每个时间步的过程的效率,因为scipy.interpolate.interp2d一次只能处理两个维度 是否有任何方法可以有效地在时间序列的两个维度上线性重新栅格/插值,而无需对循环执行(如下所示) *注意:我使用numpy memmaps将文件写入磁
scipy.interpolate.interp2d
一次只能处理两个维度
是否有任何方法可以有效地在时间序列的两个维度上线性重新栅格/插值,而无需对循环执行(如下所示)
*注意:我使用numpy memmaps将文件写入磁盘和从磁盘写入,因为它们通常太大而无法在内存中处理,而使用xarray dataarray来处理netCDF文件。我认为不可能避免循环,但因为您的网格在(lon,lat)中是规则的您可以按照建议使用更快的矩形双变量样条线
此外,xarray
还添加了一层代码不使用的索引,这可能会不必要地降低速度。特别是,如果您的数据存储在文件xarray
中,则只有在被要求读取数据时,才会将其读出
例如,您可以执行以下操作:
并将索引循环替换为:
对于枚举中的t,z(z_old):
#z是2d数组,但不确定此循环是否快得多
另外,仅供参考,您可以使用它来加快速度 该工具中有一个reglid()
方法,可帮助插值到新网格上,而无需手动循环时间片。可以为函数指定要插值到的目标栅格:
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
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