在Matlab操作HDF5文件中已經(jīng)詳細(xì)介紹了HDF5文件已經(jīng)利用Matlab對(duì)其進(jìn)行操作的方法。這篇文章總結(jié)一下如何在Python下使用HDF5文件隐轩。我們?nèi)匀话凑?a href="http://www.reibang.com/p/fc144bae3734" target="_blank">Matlab操作HDF5文件的順序進(jìn)行,分別是創(chuàng)建HDF5文件,寫(xiě)入數(shù)據(jù)撇他,讀取數(shù)據(jù)。
Python下的HDF5文件依賴h5py工具包
創(chuàng)建文件和數(shù)據(jù)集
使用`h5py.File()方法創(chuàng)建hdf5文件
h5file = h5py.File(filename,'w')
然后在此基礎(chǔ)上創(chuàng)建數(shù)據(jù)集
X = h5file.create_dataset(shape=(0,args.patch_size,args.patch_size), #數(shù)據(jù)集的維度
maxshape = (None,args.patch_size,args.patch_size), #數(shù)據(jù)集的允許最大維度
dtype=float,compression='gzip',name='train', #數(shù)據(jù)類型运褪、是否壓縮宾袜,以及數(shù)據(jù)集的名字
chunks=(args.chunk_size,args.patch_size,args.patch_size)) #分塊存儲(chǔ),每一分塊的大小
最為關(guān)系的兩個(gè)參數(shù)為shape和maxshape貌嫡,很顯然我們希望數(shù)據(jù)集的某一個(gè)維度是可以擴(kuò)展的比驻,所以在maxshape中,將希望擴(kuò)展的維度標(biāo)記為None岛抄,其他維度和shape參數(shù)里面的一樣别惦。還有一點(diǎn)值得注意的是,使用compression='gzip'
以后夫椭,整個(gè)數(shù)據(jù)集能夠被極大的壓縮掸掸,對(duì)比較大的數(shù)據(jù)集非常又用,并且在數(shù)據(jù)讀寫(xiě)的時(shí)候益楼,不用用戶顯式的解碼猾漫。
寫(xiě)數(shù)據(jù)集
在使用上面的creat_dataset創(chuàng)建了dataset以后点晴,讀寫(xiě)數(shù)據(jù)集就如同讀寫(xiě)numpy數(shù)組一樣方便,比如上面的函數(shù)定義了數(shù)據(jù)集'train'悯周,也就是變量X
以后粒督,可以下面的方法來(lái)讀寫(xiě):
data = np.zeros((100,args.patch_size,arg))
X[0:100,:,:] = data
在前面創(chuàng)建數(shù)據(jù)集的時(shí)候,我們定義shape = (args.chunk_size,args.patch_size,args.patch_size)
禽翼,如果有更多的數(shù)據(jù)屠橄,怎么辦呢?
可以使用resize方法來(lái)擴(kuò)展在maxshape
中定義為None
的那個(gè)維度:
X.resize(X.shape[0]+args.chunk_size,axis=0)
因?yàn)槲覀冊(cè)?code>maxshape=(None,args.patch_size,args.patch_size)中將第零個(gè)維度定義為可擴(kuò)展闰挡,所以锐墙,首先我們用X.shape[0]來(lái)找到該維度的長(zhǎng)度,并將其擴(kuò)展长酗。該維度擴(kuò)展以后溪北,就可以繼續(xù)向里面寫(xiě)入數(shù)據(jù)了。
讀數(shù)據(jù)集
讀取h5文件的方法也非常簡(jiǎn)單夺脾,首先利用h5py.File
方法打開(kāi)對(duì)應(yīng)的h5文件之拨,然后將里面的某個(gè)數(shù)據(jù)集取出至變量,對(duì)這個(gè)變量的讀取就如同numpy一樣了咧叭。
h = h5py.File(hd5file,'r')
train = h['train']
train[1]
train[2]
...
但是上面的讀取方法存在一個(gè)問(wèn)題就是每一次使用的時(shí)候(train[1]
,train[2]
)都需要從硬盤(pán)讀取數(shù)據(jù)蚀乔,這將會(huì)導(dǎo)致讀取的速度比較慢。一個(gè)比較好的方法是菲茬,每次從硬盤(pán)讀取一個(gè)chunk_size的數(shù)據(jù)吉挣,然后將這些數(shù)據(jù)存儲(chǔ)到內(nèi)存中,在需要的時(shí)候從內(nèi)存中讀取婉弹,比如使用下面的方法:
h = h5py.File(hd5file,'r')
train = h['train']
X = train[0:100] #一次從硬盤(pán)中讀取比較多的數(shù)據(jù)睬魂,X將存儲(chǔ)在內(nèi)存中
X[1] #從內(nèi)存中讀取
X[2] #從內(nèi)存中讀取
這樣的方法就會(huì)快很多。