一、h5py模块介绍
本文只是简单的对h5py库的基本创建文件,数据集和读取数据的方式进行介绍!如果读者需要进一步详细的学习h5py的更多知识,请参考h5py的官方文档。
h5py简单介绍
一个HDF5文件是一种存放两类对象的容器:dataset和group. Dataset是类似于数组的数据集,而group是类似文件夹一样的容器,它好比python中的字典,有键(key)和值(value),存放dataset和其他group。在使用h5py的时候需要牢记一句话:
groups类比字典
,dataset类比Numpy中的数组
。
HDF5的dataset虽然与Numpy的数组在接口上很相近,但是支持更多对外透明的
存储特征
,如:数据压缩
,误差检测
,分块传输
。
二、h5py模块使用
h5py创建的文件后缀名为:
.hdf5
1、h5py接口简单介绍
h5py模块的使用主要分成两步走:
-
1)创建
.hdf5
类型文件句柄(创建一个对象) # 读取文件把“w”改成“r”
f=h5py.File("myh5py.hdf5","w")
- 2)创建数据(dataset)或组(group)
创建数据(dataset):
1
|
f.create_dataset( self , name, shape = None , dtype = None , data = None , * * kwds) |
创建组(group):
1
|
create_group( self , name, track_order = False ) |
2、h5py的使用样例
- 创建一个h5py文件
1
2
3
|
import h5py #要是读取文件的话,就把w换成r f = h5py. File ( "myh5py.hdf5" , "w" ) |
在当前目录下会生成一个myh5py.hdf5文件
- 创建dataset数据集
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
import h5py f = h5py. File ( "myh5py.hdf5" , "w" ) #deset1是数据集的name,(20,)代表数据集的shape,i代表的是数据集的元素类型 d1 = f.create_dataset( "dset1" , ( 20 ,), 'i' ) for key in f.keys(): print (key) print (f[key].name) print (f[key].shape) print (f[key].value) 输出: dset1 / dset1 ( 20 ,) [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ] |
这里我们仅仅创建了一个存放20个整型元素的数据集,并没有赋值,默认全是0,如何赋值呢,看下面的代码。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
import h5py import numpy as np f = h5py. File ( "myh5py.hdf5" , "w" ) d1 = f.create_dataset( "dset1" ,( 20 ,), 'i' ) #赋值 d1[...] = np.arange( 20 ) #或者我们可以直接按照下面的方式创建数据集并赋值 f[ "dset2" ] = np.arange( 15 ) for key in f.keys(): print (f[key].name) print (f[key].value) 输出: / dset1 [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ] / dset2 [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ] |
如果我们有现成的numpy数组
,那么可以在创建数据集的时候就赋值,这个时候就不必指定数据的类型和形状了,只需要把数组名传给参数data
。
1
2
3
4
5
6
7
8
9
10
11
12
|
import h5py import numpy as np f = h5py. File ( "myh5py.hdf5" , "w" ) a = np.arange( 20 ) d1 = f.create_dataset( "dset1" ,data = a) for key in f.keys(): print (f[key].name) print (f[key].value) 输出: / dset1 [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ] |
现在把这几种创建的方式混合写下。看下面的代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
import h5py import numpy as np f = h5py. File ( "myh5py.hdf5" , "w" ) #分别创建dset1,dset2,dset3这三个数据集 a = np.arange( 20 ) d1 = f.create_dataset( "dset1" ,data = a) d2 = f.create_dataset( "dset2" ,( 3 , 4 ), 'i' ) d2[...] = np.arange( 12 ).reshape(( 3 , 4 )) f[ "dset3" ] = np.arange( 15 ) for key in f.keys(): print (f[key].name) print (f[key].value) 输出: / dset1 [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ] / dset2 [[ 0 1 2 3 ] [ 4 5 6 7 ] [ 8 9 10 11 ]] / dset3 [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ] 3. 创建group组 import h5py import numpy as np f = h5py. File ( "myh5py.hdf5" , "w" ) #创建一个名字为bar的组 g1 = f.create_group( "bar" ) #在bar这个组里面分别创建name为dset1,dset2的数据集并赋值。 g1[ "dset1" ] = np.arange( 10 ) g1[ "dset2" ] = np.arange( 12 ).reshape(( 3 , 4 )) for key in g1.keys(): print (g1[key].name) print (g1[key].value) 输出: / bar / dset1 [ 0 1 2 3 4 5 6 7 8 9 ] / bar / dset2 [[ 0 1 2 3 ] [ 4 5 6 7 ] [ 8 9 10 11 ]] |
注意观察数据集dset1和dset2的名字是不是有点和前面的不一样,如果是直接创建的数据集,不在任何组里面,那么它的名字就是/+名字,现在这两个数据集都在bar这个group(组)里面,名字就变成了/bar+/名字,是不是有点文件夹的感觉!继续看下面的代码,你会对group和dataset的关系进一步了解。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
import h5py import numpy as np f = h5py. File ( "myh5py.hdf5" , "w" ) #创建组bar1,组bar2,数据集dset g1 = f.create_group( "bar1" ) g2 = f.create_group( "bar2" ) d = f.create_dataset( "dset" ,data = np.arange( 10 )) #在bar1组里面创建一个组car1和一个数据集dset1。 c1 = g1.create_group( "car1" ) d1 = g1.create_dataset( "dset1" ,data = np.arange( 10 )) #在bar2组里面创建一个组car2和一个数据集dset2 c2 = g2.create_group( "car2" ) d2 = g2.create_dataset( "dset2" ,data = np.arange( 10 )) #根目录下的组和数据集 print ( "............." ) for key in f.keys(): print (f[key].name) #bar1这个组下面的组和数据集 print ( "............." ) for key in g1.keys(): print (g1[key].name) #bar2这个组下面的组和数据集 print ( "............." ) for key in g2.keys(): print (g2[key].name) #顺便看下car1组和car2组下面都有什么,估计你都猜到了为空。 print ( "............." ) print (c1.keys()) print (c2.keys()) 输出: ............. / bar1 / bar2 / dset ............. / bar1 / car1 / bar1 / dset1 ............. / bar2 / car2 / bar2 / dset2 ............. [] [] |
Reference:
到此这篇关于python中h5py开源库的使用的文章就介绍到这了,更多相关python h5py开源库内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!
原文链接:https://juejin.cn/post/7095558678891200520