h5py快速入门指南
h5py是Python语言用来操作HDF5的模块。下面的文章主要介绍h5py的快速入门指南,翻译自h5py的官方文档:http://docs.h5py.org/en/latest/quick.html 。该翻译仅为个人学习h5py为目的,如有翻译不当之处,请速联系笔者或提供正确的翻译,非常感谢!
安装
conda install h5py
用Enthought Canopy,可以使用GUI安装包安装或用
enpkg h5py
安装。用pip或setup.py安装,请参考安装方式。
核心概念
一个HDF5文件就是一个容器,用于储存两类对象:datasets,类似于数组的数据集合;groups,类似于文件夹的容器,可以储存datasets和其它groups。当使用h5py时,最基本的准则为:
groups类似于字典(dictionaries),dataset类似于Numpy中的数组(arrays)。
假设有人给你发送了一个HDF5文件, mytestfile.hdf5(如何创建这个文件,请参考:附录:创建一个文件).首先你需要做的就是打开这个文件用于读取数据:
>>> import h5py
>>> f = h5py.File('mytestfile.hdf5', 'r')
这个File对象是你的起点。那么这个文件中储存了什么呢?记住,h5py.File就像一个Python字典,因此我们可以查看这些键值,
>>> list(f.keys())
['mydataset']
根据我们的观察,这个文件中有一个dataset,即mydataset. 让我们把这个dataset作为Dataset对象来检验
>>> dset = f['mydataset']
我们得到的这个对象不是一个数组,而是一个HDF5 dataset. 就像Numpy中的数据那样,datasets有形状(shape)和数据类型(data type)
>>> dset.shape
(100,)
>>> dset.dtype
dtype('int32')
同时它们也支持数组风格的切片操作。下面是你如何完成这个文件中的一个dataset的读写的方法
>>> dset[...] = np.arange(100)
>>> dset[0]
0
>>> dset[10]
10
>>> dset[0:100:10]
array([ 0, 10, 20, 30, 40, 50, 60, 70, 80, 90])
想要更多参考,请前往File Objects和Datasets.
附录:创建一个文件
此时此刻,你也许会好奇mytestdata.hdf5是如何创建的。当File对象初始化后,我们通过将模式(mode)设置为w来创建一个文件。其它模式(mode)为a(用于读、写、新建)和r+(用于读、写)。一个完整的File模式以及它们的含义的列表可参考File对象。
>>> import h5py
>>> import numpy as np
>>> f = h5py.File("mytestfile.hdf5", "w")
File对象有几个看上去挺有趣的方法。其一为create_dataset,顾名思义,就是通过给定形状和数据类型来创建一个dataset
>>> dset = f.create_dataset("mydataset", (100,), dtype='i')
File对象是上下文管理器,因此,下面的代码也可运行
>>> import h5py
>>> import numpy as np
>>> with h5py.File("mytestfile.hdf5", "w") as f:
>>> dset = f.create_dataset("mydataset", (100,), dtype='i')
Groups和分层结构
“HDF”是“Hierarchical Data Format”的缩写。每个HDF5文件中的对象都有一个名字(name),它们以类似于POSIX风格的分层结构存放,用/分隔符分隔
>>> dset.name
u'/mydataset'
在这个系统中“文件夹”(folders)被命名为groups. 我们创建的File对象本身也是一个group, 在这种情形下是根group(root group),名字为/:
>>> f.name
u'/'
创建一个子group(subgroup)可以通过一个巧妙的命令create_group来完成。但是,我们首先需要以读/写模式来打开文件
>>> f = h5py.File('mydataset.hdf5', 'r+')
>>> grp = f.create_group("subgroup")
所有Group对象,如同File对象一样,也有create_*方法:
>>> dset2 = grp.create_dataset("another_dataset", (50,), dtype='f')
>>> dset2.name
u'/subgroup/another_dataset'
顺便说一句,你不需要手动地创建所有的中间groups. 指定一个完整的路径同样可行
>>> dset3 = f.create_dataset('subgroup2/dataset_three', (10,), dtype='i')
>>> dset3.name
u'/subgroup2/dataset_three'
Groups支持大部分的Python字典风格的接口。你可以使用条目获取(item-retrieval)的语法来获取这个文件中的对象:
>>> dataset_three = f['subgroup2/dataset_three']
迭代一个group,就会产生它的成员的名字:
>>> for name in f:
... print name
mydataset
subgroup
subgroup2
成员关系检测也可以通过使用名字来实现:
>>> "mydataset" in f
True
>>> "somethingelse" in f
False
你甚至可以使用完整的路径的名字:
>>> "subgroup/another_dataset" in f
True
它也有你熟悉的keys(), values(), items() 和iter() 的方法,以及get()方法。
因为迭代一个group只会产生它的直属成员,所以想要迭代一个完整的文件,可以使用Group的方法visit()和visititems(), 它们通过一个调用(callable)来实现:
>>> def printname(name):
... print name
>>> f.visit(printname)
mydataset
subgroup
subgroup/another_dataset
subgroup2
subgroup2/dataset_three
想要更多参考,请前往Groups.
属性
HDF5的最好特征之一就是你可以在描述的数据后储存元数据(metadata)。所有的groups和datasets都支持几个数据位的附属命名,称为属性。(All groups and datasets support attached named bits of data called attributes.)
属性可以通过attrs这个代理对象来获取,这会再一次执行字典接口:
>>> dset.attrs['temperature'] = 99.5
>>> dset.attrs['temperature']
99.5
>>> 'temperature' in dset.attrs
True
想要更多参考,请前往Attributes.
注意:本人现已开通微信公众号: Python爬虫与算法(微信号为:easy_web_scrape), 欢迎大家关注哦~~
h5py快速入门指南的更多相关文章
- AngularJS快速入门指南20:快速参考
thead>tr>th, table.reference>tbody>tr>th, table.reference>tfoot>tr>th, table ...
- AngularJS快速入门指南19:示例代码
本文给出的大部分示例都可以直接运行,通过点击运行按钮来查看结果,同时支持在线编辑代码. <div ng-app=""> <p>Name: <input ...
- AngularJS快速入门指南18:Application
是时候创建一个真正的AngularJS单页面应用程序了(SPA). 一个AngularJS应用程序示例 你已经了解了足够多的内容来创建第一个AngularJS应用程序: My Note Save Cl ...
- AngularJS快速入门指南17:Includes
使用AngularJS,你可以在HTML中包含其它的HTML文件. 在HTML中包含其它HTML文件? 当前的HTML文档还不支持该功能.不过W3C建议在后续的HTML版本中增加HTML import ...
- AngularJS快速入门指南16:Bootstrap
thead>tr>th, table.reference>tbody>tr>th, table.reference>tfoot>tr>th, table ...
- AngularJS快速入门指南15:API
thead>tr>th, table.reference>tbody>tr>th, table.reference>tfoot>tr>th, table ...
- AngularJS快速入门指南14:数据验证
thead>tr>th, table.reference>tbody>tr>th, table.reference>tfoot>tr>th, table ...
- AngularJS快速入门指南13:表单
一个AngularJS表单是一组输入型控件的集合. HTML控件 HTML输入型标签标包括: input标签 select标签 button标签 textarea标签 HTML表单 HTML表单将各种 ...
- AngularJS快速入门指南12:模块
AngularJS模块定义了一个application. 模块是一个application中不同部分的容器. application中的所有控制器都应该属于一个模块. 带有一个控制器的模块 下面这个a ...
随机推荐
- intentservice 内部类
https://blog.csdn.net/u010746364/article/details/50503586
- html基础知识梳理
1.浏览器内核 补充:blink为Google与Opera共同开发. 2.web标准 web标准为w3c和其他标准化组织制定的一系列标准的集合.(标签闭合.小写.不乱嵌套,使用外链css/js;结构行 ...
- web实验博客3.css-position
css-position属性为块级元素的定位提供了可能,今天我将讲述我所了解的position属性. div.h.p元素都可以称为块级元素,display属性可以改变其框类型,其值可以对框进行设置,默 ...
- HTML 列表中的dl,dt,dd,ul,li,ol区别及应用
无序列表 无序列表是一个项目的列表,此列项目使用粗体圆点(典型的小黑圆圈)进行标记. 无序列表始于 <ul> 标签.每个列表项始于 <li>. 有序列表 同样,有序列表也是 ...
- CSS中的px与物理像素、逻辑像素、1px边框问题
一直不太清楚CSS中的1px与逻辑像素.物理像素是个什么关系(作为一名前端感觉很惭愧 -_-!),今天终于花时间彻底弄清楚了,其实弄清楚之后就觉得事情很简单,但也只有在弄清楚之后,才会觉得简单(语出& ...
- Javascript高级编程学习笔记(19)—— 对象属性
面向对象的语言有一个标志,那就是语言中都有类的概念 前面的文章中我提到过ECMAScript中没有类的概念(ES6之前) 所以JS中的对象和其他语言中的对象存在着一些区别 ECMA中对对象的定义如下: ...
- 吴恩达机器学习笔记39-误差分析与类偏斜的误差度量(Error Analysis and Error Metrics for Skewed Classes)
如果你准备研究机器学习的东西,或者构造机器学习应用程序,最好的实践方法不是建立一个非常复杂的系统,拥有多么复杂的变量:而是构建一个简单的算法,这样你可以很快地实现它. 构建一个学习算法的推荐方法为:1 ...
- 第80节:Java中的MVC设计模式
第80节:Java中的MVC设计模式 前言 了解java中的mvc模式.复习以及回顾! 事务,设置自动连接提交关闭. setAutoCommit(false); conn.commit(); conn ...
- 纯小白创建第一个Node程序失败-容易忽略的一个细节
一直觉得自己基础还很差,所以自觉不敢去碰node.js,但又对其心怀好奇.恰巧最近有一点空闲时间,忍不住去试了一下水 这不,在创建第一个node程序时就吃了闭门羹,总是提示我没有定义,如下图, 这 ...
- Error running 'Unnamed': Address localhost:1099 is already in use
当使用idea运行项目时,出现‘Error running 'Unnamed': Address localhost:1099 is already in use’. 解决方案: 1.打开任务管理器 ...