1. 程式人生 > >python開源庫——h5py快速指南

python開源庫——h5py快速指南

數據集 rep spa 檢測 元組 但是 true hunk prompt

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

python開源庫——h5py快速指南