1. 程式人生 > >h5py快速入門指南

h5py快速入門指南

h5py是Python語言用來操作HDF5的模組。下面的文章主要介紹h5py的快速入門指南,翻譯自h5py的官方文件:http://docs.h5py.org/en/latest/quick.html 。該翻譯僅為個人學習h5py為目的,如有翻譯不當之處,請速聯絡筆者或提供正確的翻譯,非常感謝!

安裝

conda install h5py
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])

附錄:建立一個檔案

此時此刻,你也許會好奇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