python開源庫——h5py快速指南


 

1. 核心概念

 

一個HDF5文件是一種存放兩類對象的容器:dataset和group. Dataset是類似於數組的數據集,而group是類似文件夾一樣的容器,存放dataset和其他group。在使用h5py的時候需要牢記一句話:groups類比詞典,dataset類比Numpy中的數組。 
HDF5的dataset雖然與Numpy的數組在接口上很相近,但是支持更多對外透明的存儲特征,如數據壓縮,誤差檢測,分塊傳輸。

 

2. 讀取和保存HDF5文件

 

1) 讀取HDF5文件的內容

 

首先我們應該打開文件:

 

>>> import h5py >>> f = h5py.File('mytestfile.hdf5', 'r')

 

 

請記住h5py.File類似Python的詞典對象,因此我們可以查看所有的鍵值:

 

>>> f.keys() [u'mydataset']

 

 

基於以上觀測,文件中有名字為mydataset這樣一個數據集。然后我們可以用類似詞典的方法讀取對應的dataset對象。

 

>>> dset = f['mydataset']

 

 

Dset是一個HDF5的dataset對象,我們可以像Numpy的數組一樣訪問它的屬性和數據。

 

>>> dset.shape
(100,) >>> dset.dtype dtype('int32') >>> dset[...] = np.arange(100)

 

 

2) 創建一個HDF5文件

 

我們用’w’模式打開文件

 

>>> import h5py >>> import numpy as np >>> f = h5py.File("mytestfile.hdf5", "w")

 

 

然后我們借助文件對象的一系列方法添加數據。其中create_dataset用於創建給定形狀和數據類型的空dataset

 

>>> dset = f.create_dataset("mydataset", (100,), dtype='i')

 

 

我們也可以用現有的Numpy數組來初始化一個dataset

 

>>> arr = np.arange(100) >>> dset = f.create_dataset("init", data=arr)

 

 

3) 分塊存儲策略

 

在缺省設置下,HDF5數據集在內存中是連續布局的,也就是按照傳統的C序。Dataset也可以在HDF5的分塊存儲布局下創建。也就是dataset被分為大小相同的若干塊隨意地分布在磁盤上,並使用B樹建立索引。 
為了進行分塊存儲,將關鍵字設為一個元組來指示塊的形狀。

 

>>> dset = f.create_dataset("chunked", (1000, 1000), chunks=(100, 100))

 

 

也可以自動分塊,不必指定塊的形狀。

 

>>> dset = f.create_dataset("autochunk", (1000, 1000), chunks=True)

 

 

3. HDF5的分層結構

 

“HDF”代表”Hierarchical Data Format”(分層數據格式). HDF5文件中group對象類似於文件夾,我們創建的文件對象本身就是一個group,稱為root group.

 

>>> f.name u'/'

 

 

創建subgroup是使用create_group的方法實現的。但是我們需要先用讀寫模式打開文件:

 

>>> f = h5py.File('mydataset.hdf5', 'r+') >>> grp = f.create_group("subgroup")

 

 

然后grp就具有和f一樣的方法了。 
我們在group上迭代從而得到group內所有的直接附屬的成員(包括dataset和subgroup)

 

>>> for name in f: ... print name mydataset subgroup subgroup2

 

 

為了遍歷一個group內的所有直接和間接成員,我們可以使用group的visit()和visititerms()方法,這些方法需要接收一個回調函數作為參數。

 

>>> def printname(name): ... print name >>> f.visit(printname) mydataset subgroup subgroup/another_dataset subgroup2 subgroup2/dataset_three

 

 

4. 屬性

 

HDF5的一個很棒的特點是你可以在數據旁邊存儲元數據。所有的group和dataset都支持叫做屬性的數據形式。屬性通過attrs成員訪問,類似於python中詞典格式。

 

>>> dset.attrs['temperature'] = 99.5 >>> dset.attrs['temperature'] 99.5 >>> 'temperature' in dset.attrs True

 

 

5. 高級特征

 

1) 濾波器組

 

HDF5的濾波器組能夠對分塊數組進行變換。最常用的變換是高保真壓縮。使用一個特定的壓縮濾波器創建dataset之后,讀寫都可以向平常一樣,不必添加額外的步驟。 
用關鍵詞compression來指定壓縮濾波器,而濾波器的可選參數使用關鍵詞compression_opt來指定:

 

>>> dset = f.create_dataset("zipped", (100, 100), compression="gzip")

 

 

2) HDF5文件的限制

 

a. HDF5文件本身大小沒有限制,但是HDF5的一個dataset最高允許32個維,每個維度最多可有2^64個值,每個值大小理論上可以任意大 
b. 目前一個chunk允許的最大容量為2^32-1 byte (4GB). 大小固定的dataset的塊的大小不能超過dataset的大小。

 

6. 參考文獻

 

【1】 http://docs.h5py.org/en/latest/quick.html 
【2】 http://docs.h5py.org/en/latest/high/dataset.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM