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

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

  • 现在我想将所有数据存储在一个文件(或透明数据存储)中,但我不确定如何正确存储表。
    我应该如何保存表格的轴标签,以保持数据编程语言独立?
  • Pandas 或 PyTables 可以访问 HDF5 文件,但我认为它们不允许存储普通的 NumPy 数组。
    另外,我不确定将这种特殊表加载到 R 中是否容易。
  • xarray 使用基于 HDF5 的 NetCDF 格式,但是如何在一个 NetCDF 文件中存储多个表 + 数组?
    与 R 的互操作性如何?
  • 最简单的选项:只需将轴放入名为 [ds name]_axis[n] 的单独数据集?
  • 最佳答案

    你的问题很广泛,但我会尝试消除一些神话来让你开始。我只有 Python 的经验,所以我的例子只涉及在 Python 中使用 HDF5。



    您是正确的,因为 PyTables 不允许您在没有任何额外开销的情况下保存普通的 NumPy 数组。但是您不需要使用 PyTables。 h5py 提供了一个类似 NumPy 的接口(interface),用于在 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 - HDF5用于python和R之间的数据交换,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50475932/

    10-12 17:36
    查看更多