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

4

我正在进行一个需要保存和加载多个数据的项目:

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

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

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

3
您的问题比较广泛,但我会尽力消除一些谬论以帮助您入门。我只有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了解更多详细信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接