python【HDF5文件處理庫】h5py講解(看不懂你來打我)

h5py簡單介紹

h5py文件是存放兩類對象的容器,數據集(dataset)和組(group),dataset類似數組類的數據集合,和numpy的數組差不多。group是像文件夾一樣的容器,它好比python中的字典,有鍵(key)和值(value)。group中可以存放dataset或者其他的group。”鍵”就是組成員的名稱,”值”就是組成員對象本身(組或者數據集),下面來看下如何創建組和數據集。

1. 創建一個h5py文件

import h5py
#要是讀取文件的話,就把w換成r
f=h5py.File("myh5py.hdf5","w")

在當前目錄下會生成一個myh5py.hdf5文件

2. 創建dataset數據集

import h5py
f=h5py.File("myh5py.hdf5","w")
#deset1是數據集的name,(20,)代表數據集的shape,i代表的是數據集的元素類型
d1=f.create_dataset("dset1", (20,), 'i')
for key in f.keys():
    print(key)
    print(f[key].name)
    print(f[key].shape)
    print(f[key].value)
 
輸出:
dset1
/dset1
(20,)
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]

這裏我們僅僅創建了一個存放20個整型元素的數據集,並沒有賦值,默認全是0,如何賦值呢,看下面的代碼。

import h5py
import numpy as np
f=h5py.File("myh5py.hdf5","w")
 
d1=f.create_dataset("dset1",(20,),'i')
#賦值
d1[...]=np.arange(20)
#或者我們可以直接按照下面的方式創建數據集並賦值
f["dset2"]=np.arange(15)
 
for key in f.keys():
    print(f[key].name)
    print(f[key].value)
 
輸出:
/dset1
[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19]
/dset2
[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14]

如果我們有現成的numpy數組,那麼可以在創建數據集的時候就賦值,這個時候就不必指定數據的類型和形狀了,只需要把數組名傳給參數data。

import h5py
import numpy as np
f=h5py.File("myh5py.hdf5","w")
a=np.arange(20)
d1=f.create_dataset("dset1",data=a)
for key in f.keys():
    print(f[key].name)
    print(f[key].value)
 
輸出:
/dset1
[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19]

現在把這幾種創建的方式混合寫下。看下面的代碼

import h5py
import numpy as np
f=h5py.File("myh5py.hdf5","w")
#分別創建dset1,dset2,dset3這三個數據集
a=np.arange(20)
d1=f.create_dataset("dset1",data=a)
 
d2=f.create_dataset("dset2",(3,4),'i')
d2[...]=np.arange(12).reshape((3,4))
 
f["dset3"]=np.arange(15)
 
for key in f.keys():
    print(f[key].name)
    print(f[key].value)
 
輸出:
/dset1
[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19]
/dset2
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
/dset3
[ 0  1  2  3  4  5  6  7  8  9 10 
import h5py
import numpy as np
f=h5py.File("myh5py.hdf5","w")
 
#創建一個名字爲bar的組
g1=f.create_group("bar")
 
#在bar這個組裏面分別創建name爲dset1,dset2的數據集並賦值。
g1["dset1"]=np.arange(10)
g1["dset2"]=np.arange(12).reshape((3,4))
 
for key in g1.keys():
    print(g1[key].name)
    print(g1[key].value)
 
輸出:
/bar/dset1
[0 1 2 3 4 5 6 7 8 9]
/bar/dset2
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]

注意觀察數據集dset1和dset2的名字是不是有點和前面的不一樣,如果是直接創建的數據集,不在任何組裏面,那麼它的名字就是/+名字,現在這兩個數據集都在bar這個group(組)裏面,名字就變成了/bar+/名字,是不是有點文件夾的感覺!繼續看下面的代碼,你會對group和dataset的關係進一步瞭解。

import h5py
import numpy as np
f=h5py.File("myh5py.hdf5","w")
 
#創建組bar1,組bar2,數據集dset
g1=f.create_group("bar1")
g2=f.create_group("bar2")
d=f.create_dataset("dset",data=np.arange(10))
 
#在bar1組裏面創建一個組car1和一個數據集dset1。
c1=g1.create_group("car1")
d1=g1.create_dataset("dset1",data=np.arange(10))
 
#在bar2組裏面創建一個組car2和一個數據集dset2
c2=g2.create_group("car2")
d2=g2.create_dataset("dset2",data=np.arange(10))
 
#根目錄下的組和數據集
print(".............")
for key in f.keys():
    print(f[key].name)
 
#bar1這個組下面的組和數據集
print(".............")
for key in g1.keys():
    print(g1[key].name)
 
 
#bar2這個組下面的組和數據集
print(".............")
for key in g2.keys():
    print(g2[key].name)
 
#順便看下car1組和car2組下面都有什麼,估計你都猜到了爲空。
print(".............")
print(c1.keys())
print(c2.keys())
 
輸出:
.............
/bar1
/bar2
/dset
.............
/bar1/car1
/bar1/dset1
.............
/bar2/car2
/bar2/dset2
.............
[]
[]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章