python开源库——h5py快速指南

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‘)

请记住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)

2) 创建一个HDF5文件

我们用’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)

3) 分块存储策略

在缺省设置下,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. 参考文献

【1】 http://docs.h5py.org/en/latest/quick.html 
【2】 http://docs.h5py.org/en/latest/high/dataset.html

时间: 2024-11-06 03:51:00

python开源库——h5py快速指南的相关文章

Python开源库的bug

scipy 在misc的pilutil.py中def fromimage(im, flatten=0)函数中, # workaround for crash in PIL, see #1613.im.convert('L') 上面是之前的代码,当图片模式是二值模式时,此处会出错,因为im.convert('L')对原图片没有任何变化,改为 im = im.convert('L')

转:python 的开源库

Python在科学计算领域,有两个重要的扩展模块:Numpy和Scipy.其中Numpy是一个用python实现的科学计算包.包括: 一个强大的N维数组对象Array: 比较成熟的(广播)函数库: 用于整合C/C++和Fortran代码的工具包: 实用的线性代数.傅里叶变换和随机数生成函数. SciPy是一个开源的Python算法库和数学工具包,SciPy包含的模块有最优化.线性代数.积分.插值.特殊函数.快速傅里叶变换.信号处理和图像处理.常微分方程求解和其他科学与工程中常用的计算.其功能与软

开源纯C日志函数库iLOG3快速入门(八、如果你喜欢简单日志函数甚于日志函数库)

很多网友来信坚持表达了在项目中应使用简单日志函数,而不喜欢日志函数库,我与之反复争论无果,不过话说回来,我也喜欢短小轻快的日志函数库,而不是融入太多功能的臃肿库,比如日志转档我还是坚持用外部shell来实现会更好,这样的日志函数库既可以小很多,也可以更轻快稳定,我只是迫于另外一批功能控网友的"威胁"而加入了太多的功能,他们喜欢极端的一揽子解决方案,并且展示其它诸如log4c也实现了这些功能为由证明他们是正确的,如果我不实现就免谈. 最近在研发一个小型的应用服务器平台tcpdaemon,

python的一些开源库

SQLAlchemy——数据持久层框架 简介 SQLAlchemy 主要由两部分组成,一个 SQL 工具包和一个关系对象映射(ORM),它能让开发者完全发挥出 SQL 的灵活性与强大的能量.他实现了一整套企业级持久层模式,可以通过简单而 Pythonic 的接口,进行高效率和高性能的数据库访问.SQLAlchemy 的 ORM 遵从 DataMapping 设计模式,而 Elixir 则是在 SQLAlchemy 基础上的一层 ActiveRecord 模式的实现,它使用一套类似 RoR 的 A

【开源框架】Android之史上最全最简单最有用的第三方开源库收集整理,有助于快速开发,欢迎各位...

[转]http://www.tuicool.com/articles/jyA3MrU Android开源库 自己一直很喜欢Android开发,就如博客签名一样, 我是程序猿,我为自己代言 . 在摸索过程中,GitHub上搜集了很多很棒的Android第三方库,推荐给在苦苦寻找的开发者,而且我会 不定期的更新 这篇文章. Android下的优秀开发库数不胜数,在本文中,我列举的多是开发流程中最常用的一些.如果你还想了解更多的Android开源库,可以关注我的博客,每一个库都是我认真查看或者编译运行

开源框架】Android之史上最全最简单最有用的第三方开源库收集整理,有助于快速开发

[原][开源框架]Android之史上最全最简单最有用的第三方开源库收集整理,有助于快速开发,欢迎各位... 时间 2015-01-05 10:08:18 我是程序猿,我为自己代言 原文  http://blog.csdn.net/caoyouxing/article/details/42418591 主题 开源 安卓开发 http://www.tuicool.com/articles/jyA3MrU Android开源库 自己一直很喜欢Android开发,就如博客签名一样, 我是程序猿,我为自

python第三方库requests详解

Requests 是用Python语言编写,基于 urllib,采用 Apache2 Licensed 开源协议的 HTTP 库.它比 urllib 更加方便,可以节约我们大量的工作,完全满足 HTTP 测试需求.Requests 的哲学是以 PEP 20 的习语为中心开发的,所以它比 urllib 更加 Pythoner.更重要的一点是它支持 Python3 哦! Beautiful is better than ugly.(美丽优于丑陋) Explicit is better than im

免费开源ERP Odoo实施指南 连载一:Odoo概述

Odoo是什么 Odoo,以前叫OpenERP,是比利时Odoo S.A.公司开发的一个企业应用软件套件,开源套件包括一个企业应用快速开发平台,以及几千个Odoo及第三方开发的企业应用模块.Odoo适用于各种规模的企业应用. Odoo功能模块涵盖了各方面的企业应用:CRM.订单处理(销售订单和采购订单).电子商务.MRP.财务.库存.门店零售.项目管理等等. Odoo是完全的模块化结构,初始安装时候,系统没有加载任何应用模块,而后可以根据需要安装对应的功能模块. Odoo是世界上安装数量最多,用

C++开源库大全(转)

程序员要站在巨人的肩膀上,C++拥有丰富的开源库,这里包括:标准库.Web应用框架.人工智能.数据库.图片处理.机器学习.日志.代码分析等. 标准库 C++ Standard Library:是一系列类和函数的集合,使用核心语言编写,也是C++ISO自身标准的一部分. Standard Template Library:标准模板库 C POSIX library : POSIX系统的C标准库规范 ISO C++ Standards Committee :C++标准委员会 框架 C++通用框架和库