我有一个很大的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接口完成所有这些操作。
答案 0 :(得分:0)
如果将带有字符串变量的数据集写入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')