将 hdf5 文件加载到 python xarrays

Posted

技术标签:

【中文标题】将 hdf5 文件加载到 python xarrays【英文标题】:Loading hdf5 files into python xarrays 【发布时间】:2019-07-04 21:02:14 【问题描述】:

python 模块 xarray 极大地支持加载/映射 netCDF 文件,甚至懒惰地使用 dask。

我必须使用的数据源是数以千计的 hdf5 文件,其中包含大量组、数据集、属性 - 全部使用 h5py 创建。

问题是:如何将 hdf5 数据(数据集、元数据等)加载(​​甚至更好地使用 dask、lazily map)到 xarray 数据集结构中?

有没有人有这方面的经验或遇到过类似的问题? 谢谢!

【问题讨论】:

它是basic functions 之一 - 您应该阅读文档,尝试一下,如果有任何问题,请在此处报告。就目前而言,这并不是一个真正类似 SO 的问题,您可能会看到反对票。 @mdurant 谢谢你的评论。我会尽量把我的问题表述得更清楚。 我不熟悉xarray模块,但是h5pynumpy记录数组的形式访问HDF5数据。因此,您只需将 hdf5 数据集作为记录数组访问,并将数据操作为 xarray 数据集格式。 【参考方案1】:

一种可能的解决方案是在无盘非持久模式下使用 netCDF4 打开 hdf5 文件:

ncf = netCDF4.Dataset(hdf5file, diskless=True, persist=False)

现在您可以检查文件内容,包括groups

之后你可以利用xarray.backends.NetCDF4DataStore打开想要的hdf5-groups(xarray一次只能得到一个hdf5-group):

nch = ncf.groups.get('hdf5-name')
xds = xarray.open_dataset(xarray.backends.NetCDF4DataStore(nch))

这将为您提供一个数据集xds,其中包含所有属性和变量(数据集) 群组hdf5-name。请注意,您将无法访问子组。您需要通过相同的机制声明子组。如果您想申请dask,您需要添加关键字chunking 和想要的值。

对于 NetCDF 文件,解码数据没有(真正的)自动化。如果您有一个整数压缩二维变量(数据集)var 和一些属性 gainoffset,您可以将 NetCDF 特定属性 scale_factoradd_offset 添加到变量中:

var = xds['var']
var.attrs['scale_factor'] = var.attrs.get('gain')
var.attrs['add_offset'] = var.attrs.get('offset')
ds = xarray.decode_cf(xds)

这将使用 netcdf 机制解码您的变量。

此外,您可以尝试为提取的维度提供有用的名称(您会得到类似phony_dim_0phony_dim_1、...、phony_dim_N)并将新的(如示例)或现有变量/坐标分配给这些维度以获得尽可能多的 xarray 机制:

var = xds['var']
var.attrs['scale_factor'] = var.attrs.get('gain')
var.attrs['add_offset'] = var.attrs.get('offset')
dims = var.dims
xds['var'] = var.rename(dims[0]: 'x', dims[1]: 'y')
xds = xds.assign('x': (['x'], xvals, xattrs))
xds = xds.assign('y': (['y'], yvals, yattrs))
ds = xarray.decode_cf(xds)

参考文献:

netCDF4 Dataset xarray.backends.NetCDF4DataStore xarray.decode_cf

【讨论】:

这看起来是一个不错的方法,除了我在尝试打开我的 hdf5 文件时不断收到AttributeError: 'NoneType' object has no attribute 'dimensions'。是否以与 netcdf 不兼容的方式编写? @TomCho 您使用的是哪个版本的 xarray、hdf5、libnetcd 和 netCDF4。代码和错误信息是什么?

以上是关于将 hdf5 文件加载到 python xarrays的主要内容,如果未能解决你的问题,请参考以下文章

无法使用scipy.io或hdf5storage将mat文件加载到python中

将使用-v7.3(HDF5)保存的Matlab稀疏矩阵加载到Python中并对其进行操作

将经过训练的 HDF5 模型加载到 Rust 中以进行预测

在python中追加HDF5矩阵

将 HDF 文件加载到 Python Dask DataFrames 列表中

使用 Pandas、Python 将数据附加到 HDF5 文件