用于python和R

时间:2018-05-22 20:25:48

标签: python r pandas dataframe hdf5

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

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

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

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

1 个答案:

答案 0 :(得分:3)

你的问题很广泛,但我会尽力消除一些神话来帮助你开始。我只有Python经验,所以我的例子只涉及到使用HDF5和Python。

  

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