如何对含不规则二维坐标的xarray Dataset进行网格插值适配?
如何对含不规则二维坐标的xarray Dataset进行网格插值适配?
我正在使用xarray库,遇到了一些疑问。
我的数据集是这样的:
ds <xarray.Dataset> Size: 2GB Dimensions: (Latitude: 364, Longitude: 246, Lon_u: 247, Lat_v: 364, Time: 1087) Coordinates: Longitude (Latitude, Longitude) Latitude (Latitude, Longitude) Lon_u (Latitude, Lon_u) Lat_v (Lat_v, Longitude) * Time (Time) datetime64[ns] Data variables: Lat_u (Latitude, Lon_u) Lon_v (Lat_v, Longitude) uSurf (Time, Latitude, Lon_u) vSurf (Time, Lat_v, Longitude)
我想对数据进行插值(Lat_v > Latitude且Lon_u > Longitude),期望得到的结果大概是这样:
ds <xarray.Dataset> Size: 2GB Dimensions: (Latitude: 364, Longitude: 246, Time: 1087) Coordinates: Longitude (Longitude) Latitude (Latitude) * Time (Time) datetime64[ns] Data variables: uSurf (Time, Latitude, Longitude) vSurf (Time, Latitude, Longitude)
不过我不确定把二维坐标转换成一维是否合理。我了解到如果是二维坐标,它们属于逻辑坐标(Longitude、Latitude),对应不规则网格。但我觉得上面的示例其实也是不规则网格,只是维度变成了{Latitude: 364, Longitude: 246}而已。
所以我也不确定是不是应该保留这样的坐标结构:
ds <xarray.Dataset> Size: 2GB Dimensions: (Latitude: 364, Longitude: 246, Lon_u: 247, Lat_v: 364, Time: 1087) Coordinates: Longitude (Latitude, Longitude) Latitude (Latitude, Longitude) * Time (Time) datetime64[ns] Data variables: uSurf (Time, Latitude, Longitude) vSurf (Time, Latitude, Longitude)
我不太理解这种写法,感觉有点递归。比如我想获取所有Latitude值,可以这样写:
ds.Latitude.values[:, 0]
但Latitude本身又是自己的一个坐标,那是不是可以写成:
ds.Latitude.Latitude.Latitude.Latitude.values[:, 0]
这是正常行为吗?还是我的数据集有问题,需要把它扁平化?
我尝试了这段代码:
interp_coords = {'Latitude': ds.Latitude.values[:, 0], 'Longitude': ds.Longitude.values[0, :]} uSurf_interp = ds.uSurf.interp( Latitude=interp_coords['Latitude'], Lon_u=interp_coords['Longitude'], method='linear' ) vSurf_interp = ds.vSurf.interp( Lat_v=interp_coords['Latitude'], Longitude=interp_coords['Longitude'], method='linear' ) ds_interp = xr.Dataset( { 'uSurf': uSurf_interp, 'vSurf': vSurf_interp }, coords={ 'Latitude': interp_coords['Latitude'], 'Longitude': interp_coords['Longitude'], 'Time': ds.Time } )
但在第一个interp语句里遇到了错误:
ValueError: Input DataArray is not 1-D.
因为interp只接受一维坐标,所以我需要扁平化坐标,但这是我本来想避免的操作。
我查阅了xarray的文档,但没找到解决方案:
- 多维插值
- 处理多维坐标
我看到过一个很直观的示意图,但它只针对一维坐标:
更新
我现在尝试手动用np.meshgrid和scipy.interpolate.griddata来实现,同时也在尝试结合xarray.apply_ufunc来处理。
备注:内容来源于stack exchange,提问作者ChesuCR




