h5py學習(一)核心概念


因pandas的to_hdf5函數有bug TypeError: object of type 'int' has no len(),寫dataframe數據出現了報錯,遂決定直接使用h5py來寫數據。

以下翻譯自https://www.h5py.org/

核心概念

h5py包是用於HDF5二進制數據格式的Python接口

HDF5可以讓你儲存大量數值數據,以及很容易的操作NumPy的數據。比如,你可以將儲存在磁盤上多個T大小的數據進行切片,就像他們是真實的Numpy數組一樣。數以千計的數據集可以被儲存到一個文件,可以根據需要進行分類和標記。

 

一個HDF5文件是一共包含兩種對象的容器:datasets,他們是類似於數組的數據的集合。groups,他們是類似於文件夾的容器,包含了datasets和其他的groups。

何時使用h5py的最基本的事是:

Groups是像字典一樣工作,而datasets像NumPy數組一樣工作。

假設有人給你發了一個HDF5文件,mytestfile.hdf5. (關於如何創建此文件,請閱讀附錄:創建文件)您需要做的第一件事就是打開文件進行讀取:

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

這個文件對象是你的出發點。這個文件中存儲了什么?記得h5py.File文件就像一個Python字典,因此我們可以查看鍵,

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

根據我們的觀察,文件里有一組數據,mydataset。讓我們將這個數據集作為Dataset對象

>>> dset = f['mydataset']

我們得到的對象不是數組,而是HDF5 dataset.與NumPy數組一樣,datasets既有形狀也有數據類型:

>>> dset.shape
(100,)
>>> dset.dtype
dtype('int32')

它們還支持和數組一樣的的切片。這就是你讀寫數據的方式從文件中的數據集:

>>> 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。而其他的一些模式是a(用於讀/寫/創建訪問)和r+(用於讀/寫訪問)。

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

這個file對象具有幾個有趣的方法。其中一個是create_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文件中的每個對象有一個名稱,並且它們用 / 分隔符以POSIX風格的層次進行排列:

>>> dset.name
'/mydataset'

這個系統中的“folders”稱為groups. 我們創建的file對象本身就是一個group,在本例中是root group,名稱為 /

>>> f.name
'/'

創建子組是通過恰當命名的create_group來實現. 但我們需要先以“append”模式(如果存在,則讀/寫,否則創建)打開文件:

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

和file對象一樣,所有Group對象都具有create_*的方法:

>>> dset2 = grp.create_dataset("another_dataset", (50,), dtype='f')
>>> dset2.name
'/subgroup/another_dataset'

順便說一句,您不必手動創建所有的中間groups。指定完整路徑就可以了:(即所謂的層次創建)

>>> dset3 = f.create_dataset('subgroup2/dataset_three', (10,), dtype='i')
>>> dset3.name
'/subgroup2/dataset_three'

Group支持大多數Python字典樣式的接口。使用item-retrieval語法檢索文件中的對象:

>>> dataset_three = f['subgroup2/dataset_three']

迭代groups可提供其成員的名稱:

>>> 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方法visit()和visititems(),需要調用:

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

更多信息,請參見.

屬性

HDF5的一個最好的特性是您可以立即存儲元數據它所描述的數據。所有groups和datasets都支持附加一串屬性.

屬性通過attrs代理對象實現字典接口:

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

 

 


免責聲明!

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



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