python-xarray - 向 xarray 创建的 netCDF 文件添加新维度
问题描述
我有一个很大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 接口来完成所有这些工作。
解决方案
如果您将带有字符串变量的数据集写入 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')
推荐阅读
- php - 如果使用 group by 的 mysql SUM 查询中没有记录,则设为零而不是 null
- sockets - 所有服务器都使用套接字吗?
- r - 优先删除数据框中的部分重复项
- javascript - Ajax Post Data {post: '[["test",null,null,null,"test"]]'},为什么这个请求返回 406
- azure - AzureAD 邀请来宾源“Microsoft 帐户”无法登录
- postgresql - 加快多条件查询
- java - 使用java更改xml标签的值
- r - ggplot2:如何在时间序列 geom_bar 图中指示数据子集?
- c++ - Boost::Beast : 带有 websocket 管道的服务器
- navigation-drawer - 如何使用安全参数将数据从导航抽屉传递到活动?