【问题标题】:Add a new dimension to a netCDF file created by xarray向 xarray 创建的 netCDF 文件添加新维度
【发布时间】:2019-04-03 08:49:09
【问题描述】:

我有一个大的Dataset,数据组装中心想要添加一个新变量idstring带有一个新维度idstring_len。 (我不知道他们为什么要把它作为一个新变量,而不是一个属性,但是......)

所以我有

import xarray as xr
import numpy as np

ds = xr.Dataset()
ds['time'] = ('time', np.arange(1000))
ds['boo']  = ('time', np.randome.randn(1000))

# File is saved in here, then `open_dataset` to get it again. 

ds['idstr_len'] = ('idstr_len', 50)
ds['idstring'] = ('idstr_len', 'my_helpful_ID_string')

但这给了我ds['idstr_len'] = ...:

ValueError: dimensions ('idstr_len',) must have the same length as the number of data dimensions, ndim=0

所以我确信有一种好方法可以事后向数据集添加维度,但我不确定它是什么。

编辑:有关更多上下文,他们建议在原始 netcdf 中执行此操作的方式是:

TRAJECTORY_STRING = 'glider-YYYYmmddTHHMM'
trajectory = nc.createDimension('traj_strlen', len(TRAJECTORY_STRING))

trajectory = nc.createVariable('trajectory',
    'S1',
    ('traj_strlen',))

我想我可以在事后使用原始 netcdf 接口完成所有这些工作。

【问题讨论】:

    标签: python-xarray


    【解决方案1】:

    如果您将带有字符串变量的数据集写入 netCDF 文件,xarray 实际上确实创建了一个虚拟字符串长度维度,例如,考虑:

    import xarray
    ds = xarray.Dataset({'idstring': 'my_helpful_ID_string'})
    ds.to_netcdf('mydata.nc')
    

    ncdump 表明数据有一个虚拟维度string20

    $ ncdump mydata.nc
    netcdf mydata {
    dimensions:
        string20 = 20 ;
    variables:
        char idstring(string20) ;
            idstring:_Encoding = "utf-8" ;
    data:
    
     idstring = "my_helpful_ID_string" ;
    }
    

    这是必需的,因为 netCDF 的字符类型只表示单个字符。

    Xarray 并没有让你直接控制这个维度名称,但是你可以在事后用 netCDF4 修改它,例如,

    import netCDF4
    with netCDF4.Dataset('mydata.nc', 'r+') as nc:
        nc.renameDimension('string20', 'idstring_strlen')
    

    【讨论】:

    • 感谢 Stefan,这很好。它有点 hack-y,但对这种格式的要求也是如此!
    猜你喜欢
    • 2017-01-30
    • 2018-03-20
    • 2019-08-19
    • 2018-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-25
    相关资源
    最近更新 更多