Python h5py filter pipline 官方文檔
順着官方文檔讀就行,不懂的敲一敲代碼試試就知道了;
1、用到的函數:
h5create(filename,datasetname,size,Name,value)
h5write(filename,datasetname,data,start,count,stride)
2、參數說明:filename:hdf5/h5文件的文件名,包含擴展名,如'LLD-logo.hdf5';
datasetname:數據集名字,就是在h5文件中創建的dataSet名字,如'data'、‘data_LL’
size: 表示數據集的大小,也就是數據的shape,如果你以後要寫入的數據的個數維度不確定,可以把個數維度設置爲INF;
data: 要寫入的數據,其大小的'size'應該與之前創建dataSet的size一致。
Name,value:表示名稱-值形式的鍵值對,有些參數是可選的,通過 ‘參數名’-‘值’ 的形式進行賦值,一般都有默認值
start、count表示寫入data的一個子集,start表示開始的索引值,指定要寫入的第一個元素,count指沿每個維度要寫入的元素數。
stride表示間距、步幅。start、count、stride構成了data的一個超切片。
比如我要寫入一個大小(size)爲[12,12,3,24]的數組到‘myfile.h5’文件中的‘ds’數據集:可以使用命令:
h5create('myfile.h5','/ds',[12,12,3,24])
如果不存在‘myfile.h5’文件則會自動創建一個;如果有則向已有文件中寫入;
這裏我們創建一個形狀爲[12,12,3,24],作爲寫入數據集的數據,實際情況都是根據你要寫入數據的形狀來定義size。
然後寫入一個與size相同的數組到ds數據集中:
h5write('myfile.h5','/ds',mats)
這樣就可以把一個數據寫入ds數據集中了。
記錄一下今天寫h5文件的經驗:
MATLAB寫h5文件遵循:1、先創建一個空的h5文件,規定好這個文件的文件名、包含的數據集名、數據集的size(其實就是shape)、數據類型,如果要規定壓縮等級(共有0-9,默認0應該是壓縮等級最低的),還必須要指定‘ChunkSize’,最好就規定爲單位數組,比如我要寫入的數據的總size是400x400x3x15365,我的size就設爲[400x400x3x15365],ChunkSize就設爲[400,400,3,1],我設置的最高壓縮等級是9,但是也會感覺文件寫入的很慢了。2、創建數據集後才能用h5write方法寫入數據集。這裏可以指定向哪個h5文件的哪個數據集寫,如果沒有該數據集名會在該h5文件中創建該數據集,指定寫入的數據(大小要與之前創建的數據集一致),以及從數據集的什麼位置開始寫:這時候就是需要指定h5write中的start和count參數.你可以把MATLAB中的多維矩陣的存儲想象成一個個矩形小格子,比如在size爲[10,20]的矩陣中的最後[5,7]塊大小的位置存儲實際情況是這樣的:
1,1 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
6,14 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
10,20 |
從[6,14]開始,存這麼一塊“ChunkSize”爲[5,7]的數據塊。如果是3維4維或者更高維的也是同理。
MATLAB中 h5create方法是用來創建數據集的,如果這個文件不存在才創建相應的h5文件,否則是在h5文件中創建數據集;用來創建數據集時需要指定數據集的一些屬性,比如數據集的名稱、size、Datatype、ChunkSize以及壓縮級別Deflate等;先創建使要寫入的數據集先存在才能接着使用h5write方法寫入數據,寫入數據時就是以創建數據集時的各項參數寫入。最重要的是之前設置的數據類型和壓縮級別,很影響文件大小!!!
常見的hdf5/h5文件的寫入過程是:
>> data_HH = h5read('logo-1.hdf5','/data_HH');
>> h5create('test.h5','/data_HH',[200,200,3,15365],'Datatype','single','ChunkSize',[200,200,3,1],'Deflate',7)
>> h5write('test.h5','/data_HH',data_HH);
對於python來說我之前一直沒找到如何在python中使用壓縮文件,準確來說我看文檔不夠耐心和仔細,導致錯過很多重要細節;之前用hdf5文件格式讀取別人的文件只有幾百兆或者十幾個G,我一讀取再寫入往往要大了許多,當時以爲是存儲的數據類型引起的,但是其實是因爲我沒有用壓縮算法!!!對於官方文檔的配置說明看的一點也不認真,這一點也是要特別吸取教訓;
在python中只需在創建數據集的時候指定:
>>> dset = f.create_dataset("zipped", (100, 100), compression="gzip")
或:
>>> dset = f.create_dataset("zipped_max", (100, 100), compression="gzip", compression_opts=9)
即可。
python 創建壓縮的hdf5數據集:
test = h5py.File('test.h5','r+')
test.create_dataset('data_processed',data=data_processed,compression='gzip',compression_opts=7)