Python 讀取HDF5檔案

2021-10-25 01:16:18 字數 4450 閱讀 1807

使用hdf5依賴於python的工具包:h5py

使用pandas讀取

hdf的優點

hdf的優點有:

自述性:對於乙個hdf檔案裡的每乙個資料物件,有關於該資料的綜合資訊(元資料)。在沒有任何外部資訊的情況下,hdf允許應用程式解釋hdf檔案的結構和內容。

通用性:許多資料型別都可以被嵌入在乙個hdf檔案裡。例如,通過使用合適的hdf資料結構,符號、數字和圖形資料可以同時儲存在乙個hdf檔案裡。

靈活性:hdf允許使用者把相關的資料物件組合在一起,放到乙個分層結構中,向資料物件新增描述和標籤。它還允許使用者把科學資料放到多個hdf檔案裡。

擴充套件性:hdf極易容納將來新增加的資料模式,容易與其他標準格式相容。

跨平台性:hdf是乙個與平台無關的檔案格式。hdf檔案無需任何轉換就可以在不同平台上使用。

hdf資料型別

hdf有6種主要資料型別:

柵格圖象,調色盤,科學資料庫,注釋,vdata和vgroup。

· 柵格圖象: 資料模式提供一種靈活方式儲存、描述柵格圖象資料,包括8bit柵格圖象。

· 調色盤: 也叫作彩色查對表,它提供影象的色譜。

· 科學資料集: 用來儲存和描述多維科學資料陳列。

· vdata: 是乙個框架,用於儲存和描述資料表。

· hdf注釋: 是文字串,用來描述hdf檔案或hdf資料目標。

· vgroup: 是用來把相關資料目標聯絡起來。乙個vgroup可以含有其它vgroup,以及資料目標。任乙個hdf目標均可以包括進某個vgroup中。

hdf的檔案格式

hdf格式可以被看成一本帶目錄的多章節書。hdf檔案作為「資料書」,每一章包含不同型別的資料元素。hdf檔案用「資料目錄」列出資料元素。

乙個hdf 檔案應包括乙個檔案頭,乙個或多個描述符塊,若干個資料元素。

資料頭是用來確定乙個檔案是否為hdf檔案,描述符塊存有資料描述符的序號。乙個資料描述符和資料元素一起組成了資料物件。資料物件是hdf 的基本結構。

檔案頭:

檔案頭占用檔案的前4個位元組,它由4個ascii碼形式的控制字元組成,每個字元占用乙個位元組。第乙個控制字元是『n』,第二個是『c』, 第三個是『s』,第四為『a』,即(ncsa).

資料物件:

乙個資料物件是由乙個資料描述符和乙個資料元素組成。資料描述符包含了資料元素的型別、位置、尺度等資訊。資料元素是實際的資料資料。hdf 這種資料組織方式可以實現hdf 資料的自我描述。

(1) 資料描述符

所有的資料描述符都為12個位元組長,它包含4個區域:識別符號(佔16-bit),參照數(16-bit),資料偏移量(32-bit),資料長度(32-bit)。

識別符號:

資料識別符號(tag)是用來確定資料元素區資料型別的。它是16位無符號整型值(1~65535),如果沒有與其相對應的資料元素,則tag為dftga_null(或0)。下面為tag的值的說明:

1~32767——hdf 結構專用

32768~64999——可由使用者定義

65000~65535——hdf 規格擴充套件使用

參照數:

對於hdf 檔案中的每個標記符,都有唯一的乙個參照數與其相對應。參照數是乙個16—bit無符號整型數,在資料物件中一般是不可變的。標記符和參照數相結合確定唯一的資料物件。

資料偏移量和長度:

資料偏移量是指從檔案開始位置到資料元素的起始位置所包含的位元組數。長度是指整個資料元素區占用位元組數。資料偏移量和長度均為32-bit 無符號整型數。

(2) 資料元素

資料元素是資料物件中的裸資料部分。

(3) 在hdf 檔案中將資料物件分組

在hdf 檔案中通常將含有相關資料的資料物件分為一組。這些資料物件組稱為資料集。hdf 使用者採用應用介面來處理這些資料集。例如:一套8-bit的影象資料集一般有3個資料物件:一組物件用來描述資料集的成員,一組物件是影象資料,另一組物件則用來描述影象的尺度大小。乙個資料物件可以同時屬於多個資料集,例如包含在乙個柵格影象中的調色盤物件,如果它的標識號和參照值也同時包含在另乙個資料集描述符中,那麼則可以被另乙個柵格影象呼叫。

h5接受的資料是矩陣跟mat方法一致,但是具有更強的壓縮效能

使用hdf5依賴於python的工具包:h5py

# -*- coding: utf-8 -*-

import h5py

import numpy as np

#hdf5的寫入:

imgdata = np.zeros((2

,4))

f = h5py.file(

'hdf5_file.h5'

,'w'

)#建立乙個h5檔案,檔案指標是f

f['data'

]= imgdata #將資料寫入檔案的主鍵data下面

f['labels'

]= np.array([1

,2,3

,4,5

])#將資料寫入檔案的主鍵labels下面

f.close(

)#關閉檔案

#hdf5的讀取:

f = h5py.file(

'hdf5_file.h5'

,'r'

)#開啟h5檔案

# 可以檢視所有的主鍵

for key in f.keys():

print

(f[key]

.name)

print

(f[key]

.shape)

print

(f[key]

.value)

輸出結果:

(2,

4)[[

0.0.

0.0.

][0.

0.0.

0.]]

/labels(5

,)[1

2345

]process finished with exit code 0

import h5py  #匯入工具包

import numpy as np

#hdf5的寫入:

imgdata = np.zeros((30

,3,128

,256))

f = h5py.file(

'hdf5_file.h5'

,'w'

)#建立乙個h5檔案,檔案指標是f

f['data'

]= imgdata #將資料寫入檔案的主鍵data下面

f['labels']=

range

(100

)#將資料寫入檔案的主鍵labels下面

f.close(

)#關閉檔案

#hdf5的讀取:

f = h5py.file(

'hdf5_file.h5'

,'r'

)#開啟h5檔案

f.keys(

)#可以檢視所有的主鍵

a = f[

'data'][

:]#取出主鍵為data的所有的鍵值

f.close(

)

對h5py包理解不太深刻的話使用 pandas庫。

另外,為什麼單獨說pandas,主要因為本人目前對於h5py這個包的理解不是很深入,不知道如果使用該包存pd.dataframe格式的檔案,不像numpy格式檔案可以直接儲存,因此本人只能依賴pandas自帶一些函式進行處理。

2、寫入檔案

使用函式:pd.hdfstore

import numpy as np

import pandas as pd

####生成9000,0000條資料,9千萬條

a = np.random.standard_normal(

(90000000,4

))b = pd.dataframe(a)

####普通格式儲存:

h5 = pd.hdfstore(

'/data/stock/test_s.h5'

,'w'

)h5[

'data'

]= b

h5.close(

)####壓縮格式儲存

h5 = pd.hdfstore(

'/data/stock/test_c4.h5'

,'w'

, complevel=

4, complib=

'blosc'

)h5[

'data'

]= b

h5.close(

)

3、讀取檔案

使用函式:pd.read_hdf

引數:檔名,key

data=pd.read_hdf(

'/data/stock/test_c4.h5'

,key=

'data'

)

HDF5檔案讀寫

做實驗需要跑資料,caffe庫要求資料格式為hdf5.hdf5資料的import與export可以通過matlab簡單完成。hdfview可以簡單檢視hdf5資料。1.h5disp命令可以檢視hdf5資料格式 h5disp test.h5 hdf5 test.h5 group dataset dat...

HDF5檔案讀寫

做實驗需要跑資料,caffe庫要求資料格式為hdf5.hdf5資料的import與export可以通過matlab簡單完成。hdfview可以簡單檢視hdf5資料。1.h5disp命令可以檢視hdf5資料格式 1 h5disp test.h5 2hdf5 test.h5 3 group 4 data...

matlab建立HDF5檔案

一 例子 1 建立寫入 testdata uint8 magic 5 h5create my example.h5 dataset1 size testdata 建立 h5write my example.h5 dataset1 testdata 寫入 2 檢視 h5disp test.h5 3 讀...