我有两个不同的xarray数据集,它们具有不同的纬度/经度网格分辨率。我想将具有较低分辨率的一个xarray重新划分为与具有更高分辨率的一个xarray相同的分辨率。我找到了一些例子(例如http://earthpy.org/interpolation_between_grids_with_basemap.html),但它对我不起作用。这是我为测试做的一个例子:
import numpy as np
import xarray as xray
import mpl_toolkits.basemap
var1=xray.DataArray(np.random.randn(len(np.linspace(40.5,49.5,10)),len(np.linspace(-39.5,-20.5,20))),coords=[np.linspace(40.5,49.5,10), np.linspace(-39.5,-20.5,20)],dims=['lat','lon'])
(xlon, xlat)=np.meshgrid(np.linspace(-39.875,-20.125,80),np.linspace(40.125,49.875,40))
var2=xray.DataArray(-xlon**2+xlat**2,coords=[np.linspace(40.125,49.875,40),np.linspace(-39.875,-20.125,80)],dims=['lat','lon'])
mpl_toolkits.basemap.interp(var1,var1.lon,var1.lat,var2.lon,var2.lat,checkbounds=False,masked=False,order=0)
我收到以下错误:
ValueError:xout和yout必须具有相同的形状!
截图:
basemap.interp()是否需要xout和yout是相同的形状?那么var2需要是一个正方形吗?我的任何数据集几乎都不是这种情况!如何将var1重新设置为与var2相同的分辨率?
注意:在重新编译之后,我想在给定与var2相关的一些条件的情况下对var1进行子采样。例如:
var1_subset = var1.where(var2>1000)
所以我想在插值过程中尽量减少网格点的丢失。
答案 0 :(得分:1)
basemap.interp仅在xout和yout的数量或输出数量相同且nlats相同时才有效,
为什么不生成相同长度的输出nlats和nlons并稍后将其子集化。
例如:
import numpy as np
import xarray as xray
import mpl_toolkits.basemap
var1=xray.DataArray(np.random.randn(len(np.linspace(40.5,49.5,10)),len(np.linspace(-39.5,-20.5,20))),coords=[np.linspace(40.5,49.5,10), np.linspace(-39.5,-20.5,20)],dims=['lat','lon'])
(xlon,xlat)=np.meshgrid(np.linspace(-39.875,20.125,80),np.linspace(40.125,49.875,80))
var2=xray.DataArray(-xlon**2+xlat**2,coords[np.linspace(40.125,49.875,80),np.linspace(-39.875,-20.125,80)],dims=['lat','lon'])
mpl_toolkits.basemap.interp(var1,var1.lon,var1.lat,var2.lon,var2.lat,checkbounds=False,masked=False,order=0)
这是xarray的另一个很酷的技巧。
lonreg=var1.groupby_bins('lon',np.linspace(-39.875,20.125,80)).mean(dim='lon')
regridded=lonreg.groupby_bins('lat',np.linspace(-39.5,20.5,20)).mean(dim='lat')
如果你想要加权平均重新划分,通过在groupby对象上使用权重和求和函数,很容易扩展这个区域平均重新划分。