• hdf5类型文件


    HDF---Hierarchical Data Format的简称,

    hdf5是一种高级的适合大数据存储及层次逻辑数据的存储文件类型,而list及dict是数据类型.
    层次结构数据,满足层次存储及索引包括:

    1. group------------------像字典
    2. dataset-------------像numpy数组

    安装后使用报错:通过pip install h5py==2.8.0rc1更新

    对于数据集需要:
    先创建h5文件,再去读h5文件
    将dataset放在group里利用group进行层次嵌套.

    f = filename.file得到文件的根目录
    f.create_group("...../group_name")
    f.create_dataset("...../dataset_name")
    

    打开文件的模式,决定是不是可以写,读等

    1. r---只读...

    2. w----文件不存在就新建,存在就清空,

    3. a---文件已存在就在基础上写或读,否则新建,

      直接遍历一级目录名:正常迭代打印就好
      层级树状递归完全遍历:visit
      内部的属性赋值.attr["temp"] = 25 cellius

      对于创建的group或dataset对象可以用.name打印绝对路径: /foo/grp1

    一般:

    1. HDF5格式文件保存的是 : Model weights(字典,没有顺序)
    2. JSON 和 YAML 格式文件保存的是: Model structure(顺序靠json描述)
    3. h5格式:可以同时保存weights和structure

    底层存储方式

    hdf5默认存储是连续的,c类型的内存.chunked格式变成分块存储可以变成不连续,但是每个块内的数据是连续的.

    利用numpy数据初始化

    #还可以直接用np数组给dataset初始化,此时data就涵盖了shape和dtype,即shape = data.shape,....
    arr = np.arange(100)
    dset = f.create_dataset("/mydataset1",data = arr)#i4:32位的integer[-2^31,2^31]
    

    数据处理上的用途

    利用python的文件操作及数组等方式将训练数据及测试数据集标签,按数据划分方法,将文件名写入到python数组,最终将这些处理好的数组写入hdf5格式文件给dataset初始化.

    示例

    import h5py
    import numpy as np
    coco = h5py.File("D:/annot_coco.h5","r")#coco.name == / 根节点
    # print(coco)
    # print(coco["bndbox"])
    #只是遍历直接相连的一级节点
    for name in coco:
        # 本身就是字符串
        print(coco[name])
        print(coco[name][:2])
    
    # def printname(name):
    #     print(name)
    #
    #
    #
    # #遍历整个coco下的节点
    # coco.visit(printname)
    
    #dataset.attrs
    #dataset对象可以有自己的属性, 但所有属性数据的长度加起来不能超过64K, 包括属性名字.
    
    dset.attrs['length'] = 100
    dset.attrs['name'] = 'This is a dataset'
    for attr in dset.attrs:
        print attr, ":", dset.attrs[attr]
    length : 100
    name : This is a dataset
    

    注意:

    imgname_array = coco["imgname"][:]#不一样的,这是标准用法,还是要先取到全部,再去索引,否则结果维度不一样
    # imgname_ = coco["imgname"][:1]#轴不会减少
    # print(imgname_array.shape)
    # print(imgname_)#[1,16]
    # print(type(imgname_dataset))
    # print(type(imgname_array))
    img = imgname_array[0]
    

    写字符串到h5文件

    test_h5 = h5py.File("D:/test.h5","w")
    imgname = np.fromstring('000000262145.jpg',dtype=np.uint8).astype('float64')#str_imgname------>float64
    test_h5 .create_dataset('imgname', data=imgname)#变成f8之后就可以直接往h5中写了
    test_h5.close()
    """
    最后得出来的矩阵长度是字符串的长度。---1个字符串的长度就是对应编码的h5向量的长度
    如果想将多个字符串拼成一个大的numpy矩阵,写到h5文件中,必须先将字符串转换成相同长度。
    通常的做法是在字符串后面补上x00。
    """
    

    从h5数据读出字符串格式

    test_h5 = h5py.File("D:/test.h5","r")
    img = test_h5['imgname'][:]
    img = img.astype(np.uint8).tostring().decode('ascii')
    print(img)
    test_h5.close()
    
  • 相关阅读:
    Python的四种常见数据结构比较
    LeetCode Notes_#53 Maximum Subarray
    LeetCode Notes_#38 Count and Say
    LeetCode Notes_#6 Zigzag Conversion
    LeetCode Notes_#5 Longest Palindromic Substring
    《美国纽约摄影学院摄影教材》
    《艺术的故事》
    《Don't make me think》
    《Geospatial Data Science Techniques and Applications》
    《程序员的自我修养:链接、装载与库(完整版).pdf》
  • 原文地址:https://www.cnblogs.com/Henry-ZHAO/p/13892604.html
Copyright © 2020-2023  润新知