h5py快速入門指南

h5py是Python語言用來操作HDF5的模塊很澄。下面的文章主要介紹h5py的快速入門指南暗甥,翻譯自h5py的官方文檔:http://docs.h5py.org/en/latest/quick.html 挖腰。該翻譯僅為個人學(xué)習(xí)h5py為目的屡穗,如有翻譯不當(dāng)之處,請速聯(lián)系筆者或提供正確的翻譯番枚,非常感謝法严!

安裝

使用Anaconda或者Miniconda:

conda install h5py

Enthought Canopy,可以使用GUI安裝包安裝或用

enpkg h5py

安裝葫笼。用pip或setup.py安裝深啤,請參考安裝方式

核心概念

一個HDF5文件就是一個容器路星,用于儲存兩類對象:datasets溯街,類似于數(shù)組的數(shù)據(jù)集合;groups洋丐,類似于文件夾的容器呈昔,可以儲存datasets和其它groups。當(dāng)使用h5py時垫挨,最基本的準則為:

groups類似于字典(dictionaries)韩肝,dataset類似于Numpy中的數(shù)組(arrays)。

假設(shè)有人給你發(fā)送了一個HDF5文件九榔, mytestfile.hdf5(如何創(chuàng)建這個文件,請參考:附錄:創(chuàng)建一個文件).首先你需要做的就是打開這個文件用于讀取數(shù)據(jù):

>>> import h5py
>>> f = h5py.File('mytestfile.hdf5', 'r')

這個File對象是你的起點涡相。那么這個文件中儲存了什么呢哲泊?記住,h5py.File就像一個Python字典催蝗,因此我們可以查看這些鍵值切威,

>>> list(f.keys())
['mydataset']

根據(jù)我們的觀察,這個文件中有一個dataset丙号,即mydataset. 讓我們把這個dataset作為Dataset對象來檢驗

>>> dset = f['mydataset']

我們得到的這個對象不是一個數(shù)組先朦,而是一個HDF5 dataset. 就像Numpy中的數(shù)據(jù)那樣缰冤,datasets有形狀(shape)和數(shù)據(jù)類型(data type)

>>> dset.shape
(100,)
>>> dset.dtype
dtype('int32')

同時它們也支持數(shù)組風(fēng)格的切片操作。下面是你如何完成這個文件中的一個dataset的讀寫的方法

>>> dset[...] = np.arange(100)
>>> dset[0]
0
>>> dset[10]
10
>>> dset[0:100:10]
array([ 0, 10, 20, 30, 40, 50, 60, 70, 80, 90])

想要更多參考喳魏,請前往File ObjectsDatasets.

附錄:創(chuàng)建一個文件

此時此刻棉浸,你也許會好奇mytestdata.hdf5是如何創(chuàng)建的。當(dāng)File對象初始化后刺彩,我們通過將模式(mode)設(shè)置為w來創(chuàng)建一個文件迷郑。其它模式(mode)為a(用于讀、寫创倔、新建)和r+(用于讀嗡害、寫)。一個完整的File模式以及它們的含義的列表可參考File對象畦攘。

>>> import h5py
>>> import numpy as np
>>> f = h5py.File("mytestfile.hdf5", "w")

File對象有幾個看上去挺有趣的方法霸妹。其一為create_dataset,顧名思義知押,就是通過給定形狀和數(shù)據(jù)類型來創(chuàng)建一個dataset

>>> dset = f.create_dataset("mydataset", (100,), dtype='i')

File對象是上下文管理器叹螟,因此,下面的代碼也可運行

>>> import h5py
>>> import numpy as np
>>> with h5py.File("mytestfile.hdf5", "w") as f:
>>>     dset = f.create_dataset("mydataset", (100,), dtype='i')

Groups和分層結(jié)構(gòu)

“HDF”是“Hierarchical Data Format”的縮寫朗徊。每個HDF5文件中的對象都有一個名字(name)首妖,它們以類似于POSIX風(fēng)格的分層結(jié)構(gòu)存放,用/分隔符分隔

>>> dset.name
u'/mydataset'

在這個系統(tǒng)中“文件夾”(folders)被命名為groups. 我們創(chuàng)建的File對象本身也是一個group, 在這種情形下是根group(root group)爷恳,名字為/:

>>> f.name
u'/'

創(chuàng)建一個子group(subgroup)可以通過一個巧妙的命令create_group來完成有缆。但是,我們首先需要以讀/寫模式來打開文件

>>> f = h5py.File('mydataset.hdf5', 'r+')
>>> grp = f.create_group("subgroup")

所有Group對象温亲,如同F(xiàn)ile對象一樣棚壁,也有create_*方法:

>>> dset2 = grp.create_dataset("another_dataset", (50,), dtype='f')
>>> dset2.name
u'/subgroup/another_dataset'

順便說一句,你不需要手動地創(chuàng)建所有的中間groups. 指定一個完整的路徑同樣可行

>>> dset3 = f.create_dataset('subgroup2/dataset_three', (10,), dtype='i')
>>> dset3.name
u'/subgroup2/dataset_three'

Groups支持大部分的Python字典風(fēng)格的接口栈虚。你可以使用條目獲刃渫狻(item-retrieval)的語法來獲取這個文件中的對象:

>>> dataset_three = f['subgroup2/dataset_three']

迭代一個group,就會產(chǎn)生它的成員的名字:

>>> for name in f:
...     print name
mydataset
subgroup
subgroup2

成員關(guān)系檢測也可以通過使用名字來實現(xiàn):

>>> "mydataset" in f
True
>>> "somethingelse" in f
False

你甚至可以使用完整的路徑的名字:

>>> "subgroup/another_dataset" in f
True

它也有你熟悉的keys(), values(), items() 和iter() 的方法魂务,以及get()方法曼验。

因為迭代一個group只會產(chǎn)生它的直屬成員,所以想要迭代一個完整的文件粘姜,可以使用Group的方法visit()和visititems(), 它們通過一個調(diào)用(callable)來實現(xiàn):

>>> def printname(name):
...     print name
>>> f.visit(printname)
mydataset
subgroup
subgroup/another_dataset
subgroup2
subgroup2/dataset_three

想要更多參考鬓照,請前往Groups.

屬性

HDF5的最好特征之一就是你可以在描述的數(shù)據(jù)后儲存元數(shù)據(jù)(metadata)。所有的groups和datasets都支持幾個數(shù)據(jù)位的附屬命名孤紧,稱為屬性豺裆。(All groups and datasets support attached named bits of data called attributes.)

屬性可以通過attrs這個代理對象來獲取,這會再一次執(zhí)行字典接口:

>>> dset.attrs['temperature'] = 99.5
>>> dset.attrs['temperature']
99.5
>>> 'temperature' in dset.attrs
True

想要更多參考号显,請前往Attributes.

注意:本人現(xiàn)已開通微信公眾號: Python爬蟲與算法(微信號為:easy_web_scrape)臭猜, 歡迎大家關(guān)注哦~~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末躺酒,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子蔑歌,更是在濱河造成了極大的恐慌羹应,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件丐膝,死亡現(xiàn)場離奇詭異量愧,居然都是意外死亡,警方通過查閱死者的電腦和手機帅矗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進店門偎肃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人浑此,你說我怎么就攤上這事累颂。” “怎么了凛俱?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵紊馏,是天一觀的道長。 經(jīng)常有香客問我蒲犬,道長朱监,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任原叮,我火速辦了婚禮赫编,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘奋隶。我一直安慰自己擂送,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布唯欣。 她就那樣靜靜地躺著嘹吨,像睡著了一般。 火紅的嫁衣襯著肌膚如雪境氢。 梳的紋絲不亂的頭發(fā)上蟀拷,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天,我揣著相機與錄音萍聊,去河邊找鬼匹厘。 笑死,一個胖子當(dāng)著我的面吹牛脐区,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播她按,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼牛隅,長吁一口氣:“原來是場噩夢啊……” “哼炕柔!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起媒佣,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤匕累,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后默伍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體欢嘿,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年也糊,在試婚紗的時候發(fā)現(xiàn)自己被綠了炼蹦。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡狸剃,死狀恐怖掐隐,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情钞馁,我是刑警寧澤虑省,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站僧凰,受9級特大地震影響探颈,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜训措,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一伪节、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧隙弛,春花似錦架馋、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至总珠,卻和暖如春屏鳍,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背局服。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工钓瞭, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人淫奔。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓山涡,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子鸭丛,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 太陽當(dāng)空烈烈照著竞穷,蟬在無止休地鳴叫、草在結(jié)它的種子鳞溉,雞蛋花開得香氣四溢瘾带,而我在忙著完成拖了很久的工作,我們都默默無...
    mo清夜無塵閱讀 107評論 1 1
  • 1.明天和后天是一年一度的高考熟菲,六月七日和六月八日看政。因為六月七日是艾弗森的生日,最開始我就對高考的日子記得很清楚抄罕,...
    希仔仔閱讀 476評論 0 0
  • 當(dāng)危險降臨時,需要知道自己能看到什么榨崩! 我是誰谴垫? 生活的安逸讓你忘記了什么? 沉睡中醒來母蛛,看這天花板翩剪,一陣風(fēng)吹過,...
    我是曹楠閱讀 329評論 7 5
  • 很多人感到不舒服便會吃藥彩郊,目的是消除痛苦的感覺前弯,但是這是錯的。痛是上天賜給我們的禮物身體中細胞組織秫逝、器官恕出、系統(tǒng)都不...
    他欠我的海邊閱讀 351評論 0 0