使用h5py操作hdf5文件


HDF(Hierarchical Data Format)指一種為存儲和處理大容量科學數據設計的文件格式及相應庫文件。HDF 最早由美國國家超級計算應用中心 NCSA 開發,目前在非盈利組織 HDF 小組維護下繼續發展。當前流行的版本是 HDF5。HDF5 擁有一系列的優異特性,使其特別適合進行大量科學數據的存儲和操作,如它支持非常多的數據類型,靈活,通用,跨平台,可擴展,高效的 I/O 性能,支持幾乎無限量(高達 EB)的單文件存儲等。

HDF5文件層次化的存儲兩類對象:

  • dataset:數據集,一個數據集就是一個數組。數據集就是葉子節點,是文件結點。
  • group:目錄,一個group可以包含若干個key-value,其中key是字符串,value是dataset。

這兩類對象都可以設置各種屬性,屬性用於描述group和dataset的一些特點。一個HDF5文件從一個命名為“/”的group開始,一個HDF5文件只有一個根group。

用 h5py 操作 HDF5 文件,我們可以像使用目錄一樣使用 group,像使用 numpy 數組一樣使用 dataset,像使用字典一樣使用屬性,非常方便和易用。

打開/創建

class File(name, mode=None, driver=None, libver=None, userblock_size=None, **kwds)

打開或創建一個 HDF5 文件,name 為文件名字符串,mode 為打開文件的模式,driver 可以指定一種驅動方式,如需進行並行 HDF5 操作,可設置為 'mpio',libver 可以指定使用的兼容版本,默認為 'earliest',也可以指定為 'latest',userblock_size 以字節為單位指定一個在文件開頭稱作 user block 的數據塊,一般不需要設置。返回所打開文件的句柄。

mode 說明
r 只讀,文件必須存在
r+ 讀寫,文件必須存在
w 創建新文件寫,已經存在的文件會被覆蓋掉
w- / x 創建新文件寫,文件如果已經存在則出錯
a 打開已經存在的文件進行讀寫,如果不存在則創建一個新文件讀寫,此為默認的 mode

創建group

create_group(self, name, track_order=False)

創建一個新的 group。以類似目錄路徑的形式指明所創建 group 的名字 name,如果 track_order 為 True,則會跟蹤在當前 group 下的 group 和 dataset 創建的先后順序。該方法可以在打開的文件句柄(相當於 "/" group)或者一個存在的 group 對象上調用,此時 name 的相對路徑就是相對於此 group 的。

創建dataset

create_dataset(self, name, shape=None, dtype=None, data=None, **kwds)

創建一個新的 dataset。以類似文件路徑的形式指明所創建 dataset 的名字 name,shape 以一個 tuple 或 list 的形式指明創建 dataset 的 shape,用 "()" 指明標量數據的 shape,dtype 指明所創建 dataset 的數據類型,可以為 numpy dtype 或者一個表明數據類型的字符串,data 指明存儲到所創建的 dataset 中的數據。如果 data 為 None,則會創建一個空的 dataset,此時 shape 和 dtype 必須設置;如果 data 不為 None,則 shape 和 dtype 可以不設置而使用 data 的 shape 和 dtype,但是如果設置的話,必須與 data 的 shape 和 dtype 兼容。

添加attribute

打開的文件句柄(相當於 "/" group),group 和 dataset 上都可以創建 attribute,以類似於字典的操作方式創建和讀取 attribute。

示例代碼一:

import h5py
import numpy as np

X = np.random.rand(1, 10, 4).astype('float32')
y = np.random.rand(1, 10, 5).astype('float32')

h5f = h5py.File('data.h5', 'w')  # 以寫模式打開文件
h5f.create_dataset('X_train', data=X)  # 添加數據集
h5f.create_dataset('y_train', data=y)  # 添加數據集
h5f.close()

h5f = h5py.File('data.h5', 'r')  # 以讀模式打開文件
X = h5f['X_train']  # 通過下標方式獲取數據集
Y = h5f['y_train']
h5f.close()

示例代碼二:

import os

import h5py
import numpy as np

file_name = 'test.hdf5'
# create a new HDF5 file
f = h5py.File(file_name)
# create a new group
f.create_group('/grp1')  # or f.create_group('grp1')
# create a nother group inside grp1
f.create_group('/grp1/grp2')  # or f.create_group('grp1/grp2')
# create a dataset in group "/"
data = np.arange(6).reshape(2, 3)
f.create_dataset('dset1', data=data)  # or f.create_dataset('/dset1', data=data)
# create another dataset in group /grp1
f.create_dataset('grp1/dset2', data=data)  # or f.create_dataset('/grp1/dset2', data=data)
# create an attribute of "/"
f.attrs['a'] = 1  # or f.attrs['/a'] = 1
# create an attribute of group "/grp1"
f['grp1'].attrs['b'] = 'xyz'
# create an attribute of dataset "/grp1/dset2"
f['grp1/dset2'].attrs['c'] = np.array([1, 2])
# close file
f.close()

# open the existing test.hdf5 for read only
f = h5py.File(file_name, 'r')
# read dataset /dset1
print('/dset1 = %s' % f['dset1'][:])
# read dataset /grp1/dset2
print('/grp1/dset2 = %s' % f['/grp1/dset2'][:])
# get attributes
print(f.attrs['a'])
print(f['grp1'].attrs['b'])
print(f['grp1/dset2'].attrs['c'])

# remove the created file
os.remove(file_name)

示例代碼三:

import h5py
import numpy as np

file_name = 'test.hdf5'
f = h5py.File(file_name, mode='w')
data = np.array([1, 2, 3])
f['/one'] = data
f.attrs['one'] = 'haha'
print(f.attrs.keys())
print(f['one'])
print(f.attrs['one'])

參考資料

http://docs.h5py.org/en/stable/quick.html

http://www.h5py.org/

https://www.jianshu.com/p/de9f33cdfba0


免責聲明!

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



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