繁体   English   中英

子集 xarray.Dataset 关于多个坐标

[英]Subsetting xarray.Dataset with respect to multiple coordinates

假设我使用xarray.open_dataset(..., decode_times=False)加载了一个xarray.Dataset对象,打印时看起来像这样:

<xarray.Dataset>
Dimensions:    (bnds: 2, lat: 15, lon: 34, plev: 8, time: 3650)
Coordinates:
  * time       (time) float64 3.322e+04 3.322e+04 3.322e+04 3.322e+04 ...
  * plev       (plev) float64 1e+05 8.5e+04 7e+04 5e+04 2.5e+04 1e+04 5e+03 ...
  * lat        (lat) float64 40.46 43.25 46.04 48.84 51.63 54.42 57.21 60.0 ...
  * lon        (lon) float64 216.6 219.4 222.2 225.0 227.8 230.6 233.4 236.2 ...
Dimensions without coordinates: bnds
Data variables:
    time_bnds  (time, bnds) float64 3.322e+04 3.322e+04 3.322e+04 3.322e+04 ...
    lat_bnds   (lat, bnds) float64 39.07 41.86 41.86 44.65 44.65 47.44 47.44 ...
    lon_bnds   (lon, bnds) float64 215.2 218.0 218.0 220.8 220.8 223.6 223.6 ...
    hus        (time, plev, lat, lon) float64 0.006508 0.007438 0.008751 ...

将这个给定的latlontime多个范围进行子集化的最佳方法是什么? 我尝试链接一系列条件并使用xarray.Dataset.where ,但我收到一条错误消息:

IndexError: The indexing operation you are attempting to perform is not valid on netCDF4.Variable object. Try loading your data into memory first by calling .load().

我无法将整个数据集加载到内存中,那么执行此操作的典型方法是什么?

NetCDF4 不支持 NumPy 支持的所有多维索引操作。 但是确实支持切片(非常快)和一维索引(有点慢)。

一些尝试:

  • 用一维数组索引之前用切片索引(例如, .sel(time=slice(start, end)) )。 这应该将基于数组的索引从 netCDF4 卸载到 Dask/NumPy。
  • 将您的索引操作拆分为更多的中间操作,这些操作一次沿更少的维度进行索引。 听起来您已经尝试过这个,但也许值得多探索一下。
  • 要优化性能,请使用.chunk()尝试不同的 Dask 分块方案。

如果这不起作用,请将完整的独立示例发布到 GitHub 上的 xarray 问题跟踪器,我们可以更详细地查看它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM