日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

理解h5文件并使用python对h5格式文件进行读写操作

發(fā)布時(shí)間:2024/1/8 python 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 理解h5文件并使用python对h5格式文件进行读写操作 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

(一)HDF與h5

??HDF(Hierarchical Data Format層次數(shù)據(jù)格式)是一種設(shè)計(jì)用于存儲(chǔ)和組織大量數(shù)據(jù)的文件格式,最開始由美國(guó)國(guó)家超算中心研發(fā),后來由一個(gè)非盈利組織HDF Group支持。HDF支持多種商業(yè)及非商業(yè)的軟件平臺(tái),包括MATLAB、Java、Python、R和Julia等等,現(xiàn)在也提供了Spark。其版本包括了HDF4和現(xiàn)在大量用的HDF5。h5是HDF5文件格式的后綴。h5文件對(duì)于存儲(chǔ)大量數(shù)據(jù)而言擁有極大的優(yōu)勢(shì),這里安利大家多使用h5文件來存儲(chǔ)數(shù)據(jù),既高逼格又高效率。

(二)h5文件數(shù)據(jù)組織方式:像Linux文件系統(tǒng)一樣組織數(shù)據(jù)

?? h5文件中有兩個(gè)核心的概念:組“group”和數(shù)據(jù)集“dataset”。 一個(gè)h5文件就是 “dataset” 和 “group” 二合一的容器。
?? dataset :簡(jiǎn)單來講類似數(shù)組組織形式的數(shù)據(jù)集合,像 numpy 數(shù)組一樣工作,一個(gè)dataset即一個(gè)numpy.ndarray。具體的dataset可以是圖像、表格,甚至是pdf文件和excel。
?? group:包含了其它 dataset(數(shù)組) 和 其它 group ,像字典一樣工作。
?? 一個(gè)h5文件被像linux文件系統(tǒng)一樣被組織起來:dataset是文件,group是文件夾,它下面可以包含多個(gè)文件夾(group)和多個(gè)文件(dataset)。
形象來看h5數(shù)據(jù)組織方式大概像醬嬸兒的,諾!跟文件系統(tǒng)一樣,大概知道它為啥叫層次數(shù)據(jù)格式了吧!

(三)使用python對(duì)h5文件進(jìn)行操作

python對(duì)h5文件的操作依賴于h5py包
通過舉個(gè)栗子來介紹h5py包是如何讀寫h5文件的
讀h5文件:

# Reading h5 file import h5py with h5py.File('cat_dog.h5',"r") as f:for key in f.keys():#print(f[key], key, f[key].name, f[key].value) # 因?yàn)檫@里有g(shù)roup對(duì)象它是沒有value屬性的,故會(huì)異常。另外字符串讀出來是字節(jié)流,需要解碼成字符串。print(f[key], key, f[key].name) # f[key] means a dataset or a group object. f[key].value visits dataset' value,except group object. """ 結(jié)果: <HDF5 group "/dogs" (1 members)> dogs /dogs <HDF5 dataset "list_classes": shape (2,), type "|S7"> list_classes /list_classes <HDF5 dataset "train_set_x": shape (209, 64, 64, 3), type "|u1"> train_set_x /train_set_x <HDF5 dataset "train_set_y": shape (209,), type "<i8"> train_set_y /train_set_y代碼解析: 文件對(duì)象f它表示h5文件的根目錄(root group),前面說了group是按字典的方式工作的,通過f.keys()來找到根目錄下的所有dataset和group的key,然后通過key 來訪問各個(gè)dataset或group對(duì)象。結(jié)果解析: 1.我們可以發(fā)現(xiàn)這個(gè)h5文件下有1個(gè)叫dogs的文件夾(group)和3個(gè)文件(dataset)它們分別叫l(wèi)ist_classes,train_set_x,train_set_y它們的shape都可知。 dogs group下有一個(gè)成員但我們不知道它是group還是dataset。 2.我們可以發(fā)現(xiàn)key和name的區(qū)別: 上層group對(duì)象是通過key來訪問下層dataset或group的而不是通過name來訪問的; 因?yàn)閚ame屬性它是dataset或group的絕對(duì)路徑并非是真正的"name",key才是真正的"name"。 name絕對(duì)路徑:比如下文中訪問name得到:/dogs/husky,它表示根目錄下有dogs這個(gè)掛載點(diǎn),dogs下又掛載了husky。 """ dogs_group = f["dogs"]for key in dogs_group.keys():print(dogs_group[key], dogs_group[key].name) """ 結(jié)果: <HDF5 dataset "husky": shape (64, 64, 3), type "<f8"> /dogs/husky 可見dogs文件夾下有個(gè)key為husky的文件dataset """ from h5py import Dataset, Group, File with File('cat_dog.h5','r') as f:for k in f.keys():if isinstance(f[k], Dataset):print(f[k].value)else:print(f[k].name)

寫h5文件:

# Writing h5import h5py import numpy as np # mode可以是"w",為防止打開一個(gè)已存在的h5文件而清除其數(shù)據(jù),故使用"a"模式 with h5py.File("animals.h5", 'a') as f:f.create_dataset('animals_included',data=np.array(["dogs".encode(),"cats".encode()])) # 根目錄下創(chuàng)建一個(gè)總覽介紹動(dòng)物種類的dataset,字符串應(yīng)當(dāng)字節(jié)化dogs_group = f.create_group("dogs") # 在根目錄下創(chuàng)建gruop文件夾:dogsf.create_dataset('cats',data = np.array(np.random.randn(5,64,64,3))) # 根目錄下有一個(gè)含5張貓圖片的dataset文件dogs_group.create_dataset("husky",data=np.random.randn(64,64,3)) # 在dogs文件夾下分別創(chuàng)建兩個(gè)dataset,一張哈士奇圖片和一張柴犬的圖片dogs_group.create_dataset("shiba",data=np.random.randn(64,64,3))

我們來檢查一下這個(gè)animals.h5文件

with h5py.File('animals.h5','r') as f:for fkey in f.keys():print(f[fkey], fkey)print("======= 優(yōu)雅的分割線 =========")'''結(jié)果:<HDF5 dataset "animals_included": shape (2,), type "|S4"> animals_included<HDF5 dataset "cats": shape (5, 64, 64, 3), type "<f8"> cats<HDF5 group "/dogs" (2 members)> dogs'''dogs_group = f["dogs"] # 從上面的結(jié)果可以發(fā)現(xiàn)根目錄/下有個(gè)dogs的group,所以我們來研究一下它for dkey in dogs_group.keys():print(dkey, dogs_group[dkey], dogs_group[dkey].name, dogs_group[dkey].value)'''husky <HDF5 dataset "husky": shape (64, 64, 3), type "<f8"> /dogs/husky [[[ 6.22221467e-01 2.29412386e-01 1.70099600e-01][-9.53310941e-01 -1.65325168e+00 6.50092663e-02][-2.33444396e-01 5.32328485e-01 -1.23046495e+00]...[-8.27186186e-04 -9.54570238e-01 1.20224835e+00][-3.03556381e-01 5.30470941e-01 -1.49928878e-01][ 5.24641964e-01 -1.55304472e+00 1.30016600e+00]]...'''

更多騷操作可以參考h5py官方文檔。
參考文獻(xiàn):
[1] h5py官方文檔
[2] HDF官網(wǎng)

總結(jié)

以上是生活随笔為你收集整理的理解h5文件并使用python对h5格式文件进行读写操作的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。