Python xarray 向xarray创建的netCDF文件添加新维度
我有一个大的Python xarray 向xarray创建的netCDF文件添加新维度,python-xarray,Python Xarray,我有一个大的数据集,数据组装中心希望在其中添加一个新变量idstring,并添加一个新维度idstring\u len。(我不知道他们为什么想把它作为一个新变量,而不是一个属性,但是…) 所以我有 将xarray作为xr导入 将numpy作为np导入 ds=xr.Dataset() ds['time']=('time',名词短语arange(1000)) ds['boo']=('time',np.randome.randn(1000)) #文件保存在这里,然后“打开数据集”再次获取它。 ds['
数据集
,数据组装中心希望在其中添加一个新变量idstring
,并添加一个新维度idstring\u len
。(我不知道他们为什么想把它作为一个新变量,而不是一个属性,但是…)
所以我有
将xarray作为xr导入
将numpy作为np导入
ds=xr.Dataset()
ds['time']=('time',名词短语arange(1000))
ds['boo']=('time',np.randome.randn(1000))
#文件保存在这里,然后“打开数据集”再次获取它。
ds['idstr_len']=('idstr_len',50)
ds['idstring']=('idstr_len','my_help_ID_string')
但这给了我在ds['idstr_len']=…
:
ValueError: dimensions ('idstr_len',) must have the same length as the number of data dimensions, ndim=0
因此,我确信有一种很好的方法可以在事后向数据集添加维度,但我不确定它是什么
编辑:对于更多上下文,他们建议在原始netcdf中执行此操作的方式是:
轨迹\u字符串='glider YYYYmmddTHHMM'
轨迹=nc.createDimension('traj_strlen',len(轨迹字符串))
轨迹=nc.createVariable('轨迹',
"S1",,
('traj_strlen',))
我想我可以在事后使用原始netcdf接口来完成所有这些 如果将带有字符串变量的数据集写入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')
如果将带有字符串变量的数据集写入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,很好用。这是一个有点黑客,但这是对该格式的要求!谢谢Stefan,很好用。这是一个有点黑客,但这是对该格式的要求!