You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何对含不规则二维坐标的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 > LatitudeLon_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的文档,但没找到解决方案:

  • 多维插值
  • 处理多维坐标

我看到过一个很直观的示意图,但它只针对一维坐标:
xarray一维坐标示意图


更新

我现在尝试手动用np.meshgridscipy.interpolate.griddata来实现,同时也在尝试结合xarray.apply_ufunc来处理。

备注:内容来源于stack exchange,提问作者ChesuCR

火山引擎 最新活动