HDF5 用于 python 和 R 之间的数据交换
HDF5 for data exchange between python and R
我正在做一个需要保存和加载多个的项目:
- Scalars/Matrices/Arrays
- 表格(即带有列和行注释的矩阵)
现在我想将所有数据存储在一个文件中(或透明数据存储),但我不确定如何正确存储 tables。
我应该如何保存 table 的轴标签,以保持数据编程语言独立的方式?
- Pandas 或 PyTables 可以访问 HDF5 文件,但我认为它们不允许存储纯 NumPy 数组。
另外,我不确定将这种特殊的 tables 加载到 R. 中是否容易
- xarray 使用基于 HDF5 的 NetCDF 格式,但如何将多个表 + 数组存储在一个 NetCDF 文件中?
与 R 的互操作性如何?
- 最简单的选项:只需将坐标轴放入名为 [ds name]_axis[n]?
的单独数据集中
你的问题很宽泛,但我会尝试消除一些误解,让你开始。我只有 Python 方面的经验,因此我的示例将仅涉及将 HDF5 与 Python.
一起使用
Pandas or PyTables can access HDF5 files, but they do not allow to
store plain NumPy arrays I think.
您是正确的,因为 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)
您可以根据自己的要求进一步探索压缩和分块选项,以优化 read/write 性能和压缩率。但是请注意,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 了解更多详细信息。
我正在做一个需要保存和加载多个的项目:
- Scalars/Matrices/Arrays
- 表格(即带有列和行注释的矩阵)
现在我想将所有数据存储在一个文件中(或透明数据存储),但我不确定如何正确存储 tables。
我应该如何保存 table 的轴标签,以保持数据编程语言独立的方式?
- Pandas 或 PyTables 可以访问 HDF5 文件,但我认为它们不允许存储纯 NumPy 数组。
另外,我不确定将这种特殊的 tables 加载到 R. 中是否容易
- xarray 使用基于 HDF5 的 NetCDF 格式,但如何将多个表 + 数组存储在一个 NetCDF 文件中?
与 R 的互操作性如何? - 最简单的选项:只需将坐标轴放入名为 [ds name]_axis[n]? 的单独数据集中
你的问题很宽泛,但我会尝试消除一些误解,让你开始。我只有 Python 方面的经验,因此我的示例将仅涉及将 HDF5 与 Python.
一起使用Pandas or PyTables can access HDF5 files, but they do not allow to store plain NumPy arrays I think.
您是正确的,因为 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)
您可以根据自己的要求进一步探索压缩和分块选项,以优化 read/write 性能和压缩率。但是请注意,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 了解更多详细信息。