h5py基础教程

核心概念

       一个HDF5文件就是一个容器。用于存储两类对象:datasets,类似于数组的数据集合groups,类似于文件夹的容器,可以存储datasets和groups。当使用h5py时,最基本的准则为:

groups类似于字典(dictionaries),datasets类似于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 ObjectsDatasets

附录:创建一个文件

       此时此刻,你也许会好奇mytestdata.hdf5是如何创建的。当File对象初始化后,我们通过将模式(mode)设置为w来创建一个文件。其它模式(mode)为a(用于读、写、新建)和r+(用于读写)。一个完整的File模式以及它们的含义的列表可参考File对象

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

       File对象有几个有趣的方法。其一为create_dataset,顾名思义,就是通过给定形状和数据类型来创建一个dataset

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

       File对象是上下文管理器,因此,下面代码也可运行

>>>import h5py
>>>import numpy as np
>>> with h5py.File("mytestdata.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("mytestdata.hdf5","r+") 
>>>grp = f.create_group("subgroup")

       所有Group对象,如同File对象一样,也有create_*方法(即可在其下创建子dataset和子Group):

>>>daset2 = 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.sttrs['temprature'] = 99.5
>>>dset.attrs['temprature']
99.5
>>>'temprature' in dset.attrs
True

       详情更多请参考Attributes

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值