zoukankan      html  css  js  c++  java
  • h5py快速入门指南

    h5py是Python语言用来操作HDF5的模块。下面的文章主要介绍h5py的快速入门指南,翻译自h5py的官方文档:http://docs.h5py.org/en/latest/quick.html 。该翻译仅为个人学习h5py为目的,如有翻译不当之处,请速联系笔者或提供正确的翻译,非常感谢!

    安装

    使用Anaconda或者Miniconda:

    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 ObjectsDatasets.

    附录:创建一个文件

    此时此刻,你也许会好奇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), 欢迎大家关注哦~~

  • 相关阅读:
    WCF 第五章 行为 总结
    WCF 第五章 行为 为服务终结点行为实现一个消息检测器
    WCF 第五章 行为 安全行为
    WCF 第五章 行为 通过配置文件暴露一个服务行为
    静观己心,厚积薄发
    WCF 第五章 行为 实现自定义行为
    创建进程 和 列出所有进程
    递归和分治算法经典题目
    CreateToolhelp32Snapshot
    Base64 编解码C语言实现
  • 原文地址:https://www.cnblogs.com/jclian91/p/9782600.html
Copyright © 2011-2022 走看看