h5py

1. 核心概念

一个HDF5文件是一种存放两类对象的容器:dataset和group. Dataset是类似于数组的数据集,而group是类似文件夹一样的容器,存放dataset和其他group。在使用h5py的时候需要牢记一句话:groups类比词典,dataset类比Numpy中的数组。
HDF5的dataset虽然与Numpy的数组在接口上很相近,但是支持更多对外透明的存储特征,如数据压缩,误差检测,分块传输。

2. 读取和保存HDF5文件

首先我们应该打开文件:

>>> import h5py
>>> f = h5py.File('mytestfile.hdf5', 'r')

请记住h5py.File类似python的词典对象,因此我们可以查看所有的键值:

>>> f.keys()
[u'mydataset']

基于以上观测,文件中有名字为mydataset这样一个数据集。然后我们可以用类似词典的方法读取对应的dataset对象。

>>> dset = f['mydataset']

Dset是一个HDF5的dataset对象,我们可以像Numpy的数组一样访问它的属性和数据。

>>> dset.shape
(100,)
>>> dset.dtype
dtype('int32')
>>> dset[...] = np.arange(100)

我们用’w’模式打开文件

>>> import h5py
>>> import numpy as np
>>> f = h5py.File("mytestfile.hdf5", "w")

然后我们借助文件对象的一系列方法添加数据。其中create_dataset用于创建给定形状和数据类型的空dataset

>>> dset = f.create_dataset("mydataset", (100,), dtype='i')

我们也可以用现有的Numpy数组来初始化一个dataset

>>> arr = np.arange(100)
>>> dset = f.create_dataset("init", data=arr)

在缺省设置下,HDF5数据集在内存中是连续布局的,也就是按照传统的C序。Dataset也可以在HDF5的分块存储布局下创建。也就是dataset被分为大小相同的若干块随意地分布在磁盘上,并使用B树建立索引。
为了进行分块存储,将关键字设为一个元组来指示块的形状。

>>> dset = f.create_dataset("chunked", (1000, 1000), chunks=(100, 100))

也可以自动分块,不必指定块的形状。

>>> dset = f.create_dataset("autochunk", (1000, 1000), chunks=True)

3. HDF5的分层结构

“HDF”代表”Hierarchical Data Format”(分层数据格式). HDF5文件中group对象类似于文件夹,我们创建的文件对象本身就是一个group,称为root group.

>>> f.name
u'/'

创建subgroup是使用create_group的方法实现的。但是我们需要先用读写模式打开文件:

>>> f = h5py.File('mydataset.hdf5', 'r+')
>>> grp = f.create_group("subgroup")

然后grp就具有和f一样的方法了。
我们在group上迭代从而得到group内所有的直接附属的成员(包括dataset和subgroup)

>>> for name in f:
...     print name
mydataset
subgroup
subgroup2

为了遍历一个group内的所有直接和间接成员,我们可以使用group的visit()和visititerms()方法,这些方法需要接收一个回调函数作为参数。

>>> def printname(name):
...     print name
>>> f.visit(printname)
mydataset
subgroup
subgroup/another_dataset
subgroup2
subgroup2/dataset_three

4. 属性

HDF5的一个很棒的特点是你可以在数据旁边存储元数据。所有的group和dataset都支持叫做属性的数据形式。属性通过attrs成员访问,类似于python中词典格式。

>>> dset.attrs['temperature'] = 99.5
>>> dset.attrs['temperature']
99.5
>>> 'temperature' in dset.attrs
True

5. 高级特征

1) 滤波器组
HDF5的滤波器组能够对分块数组进行变换。最常用的变换是高保真压缩。使用一个特定的压缩滤波器创建dataset之后,读写都可以向平常一样,不必添加额外的步骤。
用关键词compression来指定压缩滤波器,而滤波器的可选参数使用关键词compression_opt来指定:

>>> dset = f.create_dataset("zipped", (100, 100), compression="gzip")

2) HDF5文件的限制
a. HDF5文件本身大小没有限制,但是HDF5的一个dataset最高允许32个维,每个维度最多可有2^64个值,每个值大小理论上可以任意大
b. 目前一个chunk允许的最大容量为2^32-1 byte (4GB). 大小固定的dataset的块的大小不能超过dataset的大小。

6. 参考文献

http://docs.h5py.org/en/latest/quick.html
http://docs.h5py.org/en/latest/high/dataset.html

### 如何在Anaconda中安装和使用h5py库 #### 安装h5py库 为了确保最佳兼容性和性能,在Anaconda环境中推荐优先通过`conda`命令来安装h5py库。这可以通过简单的命令完成: ```bash conda install h5py ``` 这条指令会让Conda自动处理依赖关系并安装最适合当前环境的h5py版本[^2]。 如果希望获取特定版本的h5py,可以在上述命令基础上指定版本号,例如要安装1.10.4版,则可以执行如下命令: ```bash conda install h5py=1.10.4 ``` 对于某些特殊情况,当需要更灵活控制安装过程或是想要尝试最新的特性时,也可以考虑使用`pip`工具来进行安装。不过在此之前建议先创建一个新的虚拟环境以免影响现有项目: ```bash conda create --name myenv python=3.7 conda activate myenv pip install h5py ``` 这里首先创建了一个名为`myenv`的新环境,并激活该环境后再运行`pip install h5py`命令以安装最新发布的h5py包。 #### 使用h5py库 一旦完成了h5py的成功安装,便可以直接导入此库到Python脚本或交互式解释器当中开始工作了。下面给出一段简单示例代码展示基本操作方式: ```python import numpy as np import h5py # 创建文件对象 f = h5py.File('example.hdf5', 'w') # 添加数据集 dataset = f.create_dataset("dset", (100,), dtype='i') for i in range(100): dataset[i] = i ** 2 # 关闭文件连接 f.close() # 打开已存在的HDF5文件读取其中的数据 g = h5py.File('example.hdf5', 'r') print(g['dset'][:]) # 输出整个数组的内容 g.close() ``` 这段程序展示了如何利用h5py创建新的HDF5格式文件、向其内部写入整数序列作为数据集以及稍后再次打开同一个文件从中提取之前保存的信息[^1]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值