用于python和R之间数据交换的HDF5

Posted

技术标签:

【中文标题】用于python和R之间数据交换的HDF5【英文标题】:HDF5 for data exchange between python and R 【发布时间】:2018-11-01 17:01:01 【问题描述】:

我正在做一个需要保存和加载多个的项目:

标量/矩阵/数组 表格(即带有列和行注释的矩阵)

现在我想将所有数据存储在一个文件中(或透明数据存储),但我不确定如何正确存储表格。 我应该如何保存表格的轴标签,以保持数据编程语言的独立性?

Pandas 或 PyTables 可以访问 HDF5 文件,但我认为它们不允许存储普通的 NumPy 数组。 另外,我不确定将这样的特殊表加载到 R 中是否容易。 xarray 使用基于 HDF5 的 NetCDF 格式,但是如何在一个 NetCDF 文件中存储多个表 + 数组? 与 R 的互操作性如何? 最简单的选择:只需将坐标区放入名为 [ds name]_axis[n] 的单独数据集中?

【问题讨论】:

【参考方案1】:

您的问题很笼统,但我会尝试消除一些误解以帮助您入门。我只有 Python 方面的经验,所以我的示例只涉及在 Python 中使用 HDF5。

Pandas 或 PyTables 可以访问 HDF5 文件,但它们不允许 存储我认为的普通 NumPy 数组。

您是正确的,因为 PyTables 不允许您在没有任何额外开销的情况下保存一个普通的 NumPy 数组。但是您不需要 使用 PyTables。 h5py 提供了一个类似 NumPy 的接口,用于在 HDF5 文件中存储和访问数组。

存储一个 NumPy 数组

import h5py, numpy as np

arr = np.random.randint(0, 10, (1000, 1000))

f = h5py.File('file.h5', 'w', libver='latest')  # use 'latest' for performance

dset = f.create_dataset('array', shape=(1000, 1000), data=arr, chunks=(100, 100)
                        compression='gzip', compression_opts=9)

您可以根据自己的要求进一步探索压缩和分块选项,以优化读/写性能和压缩比。但是请注意,gzip 是少数几个随所有 HDF5 安装一起提供的压缩过滤器之一。

将轴标签存储为属性

属性类似于数据集,允许您存储范围广泛的数据,包括标量或数组。

dset.attrs['Description'] = 'Some text snippet'
dset.attrs['X-Labels'] = np.arange(1000)
dset.attrs['Y-Labels'] = np.arange(1000)

在内部,数据不存储为 NumPy 数组,而是根据 HDF5 规范存储在数据类型敏感的连续内存块中。因此,您将能够从任何 HDF5 API 读取这些文件。

值得注意的是,确保字符串可传输有特定要求,有关详细信息,请参阅h5py 文档中的Strings in HDF5。

【讨论】:

以上是关于用于python和R之间数据交换的HDF5的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Python 和 R 之间交换 Msgpack 文件?

一个 Python 和 JavaScript 交换数据的库

一个 Python 和 JavaScript 交换数据的库

django/python - 在我的基础架构和客户之间交换数据的推荐安全方式是啥?

如何在 hdf5 中有效地保存 python pandas 数据帧并将其作为 R 中的数据帧打开?

哪些数据交换格式可用于 python 和 java 应用程序相互通信?