python开源库h5py快速指南

摘要:
使用h5py时,您需要记住一句话:Numpy中的组类比字典、数据集类比数组。˃˃数据集形状˃˃数据集数据类型˃˃数据集[…]=np。Arange123452)要创建HDF5文件,我们使用“w”模式打开文件˃˃˃˃importh5py˃˃importnumpyasnp˃˃f=h5py。File123,然后我们使用file对象的一系列方法来添加数据。˃˃defprintname:…printname˃˃˃f。visitmydatasetsubgroupsubgroup/aother_datasetsubgroup2subgroup2/dataset_3 123456784。HDF5属性的一个重要功能是可以在数据旁边存储元数据。属性通过attrs成员访问,类似于python中的字典格式。

转自:http://blog.csdn.net/yudf2010/article/details/50353292

1. 核心概念

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

2. 读取和保存HDF5文件

1) 读取HDF5文件的内容

首先我们应该打开文件:

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

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

>>> f.keys()
[u'mydataset']
  • 1
  • 2

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

>>> dset = f['mydataset']
  • 1

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

>>> dset.shape
(100,)
>>> dset.dtype
dtype('int32')
>>> dset[...] = np.arange(100)
  • 1
  • 2
  • 3
  • 4
  • 5

2) 创建一个HDF5文件

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

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

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

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

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

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

3) 分块存储策略

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

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

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

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

3. HDF5的分层结构

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

>>> f.name
u'/'
  • 1
  • 2

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

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

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

>>> for name in f:
...     print name
mydataset
subgroup
subgroup2
  • 1
  • 2
  • 3
  • 4
  • 5

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

>>> def printname(name):
...     print name
>>> f.visit(printname)
mydataset
subgroup
subgroup/another_dataset
subgroup2
subgroup2/dataset_three
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

4. 属性

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

>>> dset.attrs['temperature'] = 99.5
>>> dset.attrs['temperature']
99.5
>>> 'temperature' in dset.attrs
True
  • 1
  • 2
  • 3
  • 4
  • 5

5. 高级特征

1) 滤波器组

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

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

2) HDF5文件的限制

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

免责声明:文章转载自《python开源库h5py快速指南》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇flutter webview_flutter 设置cookies开源文字识别软件tesseract下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

python中yield的用法及生成器的理解

首先我要吐槽一下,看程序的过程中遇见了yield这个关键字,然后百度的时候,发现没有一个能简单的让我懂的,讲起来真TM的都是头头是道,什么参数,什么传递的,还口口声声说自己的教程是最简单的,最浅显易懂的,我就想问没有有考虑过读者的感受。 接下来是正题: 首先,如果你还没有对yield有个初步分认识,那么你先把yield看做“return”,这个是直观的,它...

python 第三方库BeautifulSoup4文档学习(4)

bs4 搜索文档树 搜索文档树有很多方法,比较常用的是find()和find_all() ,在方法中我们通常需要加上特定的参数去查找我们需要的内容,这样的参数就被看作为过滤器。 依然使用官方提供的测试html文档 html_doc = """ <html><head><title>The Dormouse's story...

python装饰器系列(七)

装饰器 利用__call__方法实现单例 所谓单例,是指一个类的实例从始至终只能被创建一次。单例的实现有多种,这里以__call__方法来实现 1 class Single: 2 __instance = None 3 4 def __init__(self,cls): 5 self.cls = cls...

python之PIL库(Image模块)

PIL(Python Image Library)是python的第三方图像处理库,PIL的功能非常的强大,几乎被认定是Python的官方图像处理库了。 由于PIL仅支持到python2.7于是一群志愿者在PIL的基础上创建了兼容的版本,名字叫Pillow,支持最新的python3,而且扩容了很多特性,所以在python3我们可以直接安装Pillow。 我...

使用 python 进行身份证号校验

使用 python 代码进行身份证号校验 先说,还有很多可以优化的地方。 1、比如加入15位身份证号的校验,嗯哼,15位的好像没有校验,那就只能提取个出生年月日啥的了。 2、比如判断加入地址数据库,增加输出信息 3、增加时间判断,出生日期大于当前时间的判为非法 代码是老师放了一个提取出生年月日的题目扩展过来的,目前来看代码运行正常,有没有bug就不造了。...

python中正则表达式在中文字符串匹配时的坑

之前一直有使用python 正则表达式来做中文字符串或者中英文数字混合的字符串的匹配,发现有不少情况下会匹配失灵或者结果混乱,并且在不同操作系统上匹配结果也不一致,查了很久都不知道是什么原因。今天终于彻底弄懂了,原来还是python中对中文的编码问题造成的。 解决办法: step1 在设置默认编码为UTF8之后,将正则表达式和待匹配字符串都decode("...