资讯

展开

利用xesmf对网格数据进行regrid

作者:快盘下载 人气:

对比不同分辨率的网格数据时,通常需要将数据插值到相同网格。有很多工具可以实现此功能,本文主要讲一下如何利用xesmf对网格数据进行regrid。

工具安装就不说了,首先导入所需要的库:

import xarray as xr
import xesmf as xe
import numpy as np

然后获取CMIP5的月表面温度数据:

url = 'http://dapds00.nci.org.au/thredds/dodsC/rr3/CMIP5/output1/CSIRO-BOM/ACCESS1-3/historical/mon/atmos/Amon/r1i1p1/latest/tas/tas_Amon_ACCESS1-3_historical_r1i1p1_185001-200512.nc'
ds = xr.open_dataset(url)

执行如下语句可以得到原始数据的经纬度网格分辨率:

(ds['lat'].max() - ds['lat'].min())/(ds['lat'].count()-1.)

(ds['lon'].max() - ds['lon'].min())/(ds['lon'].count()-1.)

原始的数据分辨率为 1.25 x 1.875 度,然后将网格插值为2.5x2.5度。可以直接利用 xesmf 的相关函数生成网格:

ds_out = xe.util.grid_2d(-180.0, 180.0, 2.5, -90.0, 90.0, 2.5)

下一步创建 regridder,默认情况下不会保存所使用的权重信息。注意:由于这里所使用的是全球数据,periodic=True是为了保证在沿着中心经度时不会出现空白间隙。

regridder = xe.Regridder(ds, ds_out, 'bilinear', periodic=True)

下一步就是进行插值操作了:

tas_25deg = regridder(ds['tas'])

可以绘图对比一下结果:

ds['tas'].isel(time=0).plot()
tas_25deg.isel(time=0).plot()

利用xesmf对网格数据进行regrid

插值前后温度分布

如果需要频繁的对相同网格分辨率的数据进行插值,可以重复利用权重信息以节省时间。通过指定文件名保存权重信息:

regridder_save_weights = xe.Regridder(ds,ds_out,'bilinear',periodic=True,filename='bilinear_145x192_180x360_peri.nc')

然后使用保存的权重信息构建 regridder:

regridder_reuse_weights = xe.Regridder(ds,ds_out,'bilinear',periodic=True,reuse_weights=True,filename='bilinear_145x192_180x360_peri.nc')

xesmf支持多种投影方式的网格插值操作,详细信息可以前往官方文档查看。

加载全部内容

相关教程
猜你喜欢
用户评论
快盘暂不提供评论功能!