zoukankan      html  css  js  c++  java
  • python库——h5py入门讲解

    本文只是简单的对h5py库的基本创建文件,数据集和读取数据的方式进行介绍,作者刚接触h5py,完全靠看文档自学,如果哪里说的不对,欢迎纠正!如果读者需要进一步详细的学习h5py的更多知识,请参考h5py的官方文档


    h5py简单介绍

    h5py文件是存放两类对象的容器,数据集(dataset)和组(group),dataset类似数组类的数据集合,和numpy的数组差不多。group是像文件夹一样的容器,它好比python中的字典,有键(key)和值(value)。group中可以存放dataset或者其他的group。”键”就是组成员的名称,”值”就是组成员对象本身(组或者数据集),下面来看下如何创建组和数据集。

    1. 创建一个h5py文件

    import h5py
    #要是读取文件的话,就把w换成r
    f=h5py.File("myh5py.hdf5","w")

    在当前目录下会生成一个myh5py.hdf5文件

    2. 创建dataset数据集

    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,如何赋值呢,看下面的代码。

    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。

    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]

    现在把这几种创建的方式混合写下。看下面的代码

    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的关系进一步了解。

    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
    .............
    []
    []
  • 相关阅读:
    深入探析c# Socket
    异步上传文件并获得返回值(完全跨域)
    ASP.NET MVC的Model元数据与Model模板:模板的获取与执行策略
    数值压缩存储方法Varint
    JavaIO知识总结2
    ASP.NET MVC URL重写与优化
    检测是否为HTML5新标签
    Context+ContextScope——这是否可以看作一种设计模式?
    体验vs11 Beta
    选择实现—简单工厂
  • 原文地址:https://www.cnblogs.com/neuzk/p/9476444.html
Copyright © 2011-2022 走看看