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

python開源庫——h5py快速指南(轉載)

文章目錄

核心概念

一個HDF5檔案是一種存放兩類物件的容器:dataset和group. Dataset是類似於陣列的資料集,而group是類似資料夾一樣的容器,存放dataset和其他group。在使用h5py的時候需要牢記一句話:groups類比詞典,dataset類比Numpy中的陣列。
HDF5的dataset雖然與Numpy的陣列在介面上很相近,但是支援更多對外透明的儲存特徵,如資料壓縮,誤差檢測,分塊傳輸。

讀取和儲存HDF5檔案

讀取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)

建立一個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)

分塊儲存策略

在預設設定下,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)

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

屬性

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

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

高階特徵

濾波器組

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

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

####HDF5檔案的限制

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


原文地址:http://www.cnblogs.com/antflow/p/7352775.html