溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

HDF5文件如何利用Python實(shí)現(xiàn)存儲(chǔ)或讀取

發(fā)布時(shí)間:2020-11-25 14:22:14 來(lái)源:億速云 閱讀:405 作者:Leah 欄目:開發(fā)技術(shù)

本篇文章給大家分享的是有關(guān)HDF5文件如何利用Python實(shí)現(xiàn)存儲(chǔ)或讀取,小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說(shuō),跟著小編一起來(lái)看看吧。

HDF5 簡(jiǎn)介

HDF(Hierarchical Data Format)指一種為存儲(chǔ)和處理大容量科學(xué)數(shù)據(jù)設(shè)計(jì)的文件格式及相應(yīng)庫(kù)文件。HDF 最早由美國(guó)國(guó)家超級(jí)計(jì)算應(yīng)用中心 NCSA 開發(fā),目前在非盈利組織 HDF 小組維護(hù)下繼續(xù)發(fā)展。當(dāng)前流行的版本是 HDF5。HDF5 擁有一系列的優(yōu)異特性,使其特別適合進(jìn)行大量科學(xué)數(shù)據(jù)的存儲(chǔ)和操作,如它支持非常多的數(shù)據(jù)類型,靈活,通用,跨平臺(tái),可擴(kuò)展,高效的 I/O 性能,支持幾乎無(wú)限量(高達(dá) EB)的單文件存儲(chǔ)等。

HDF5 結(jié)構(gòu)

HDF5 文件一般以 .h6 或者 .hdf5 作為后綴名,需要專門的軟件才能打開預(yù)覽文件的內(nèi)容。HDF5 文件結(jié)構(gòu)中有 2 primary objects: Groups 和 Datasets。

Groups 就類似于文件夾,每個(gè) HDF5 文件其實(shí)就是根目錄 (root) group'/',可以看成目錄的容器,其中可以包含一個(gè)或多個(gè) dataset 及其它的 group。

Datasets 類似于 NumPy 中的數(shù)組 array,可以當(dāng)作數(shù)組的數(shù)據(jù)集合 。

每個(gè) dataset 可以分成兩部分: 原始數(shù)據(jù) (raw) data values 和 元數(shù)據(jù) metadata (a set of data that describes and gives information about other data => raw data)。

+-- Dataset
|  +-- (Raw) Data Values (eg: a 4 x 5 x 6 matrix)
|  +-- Metadata
|  |  +-- Dataspace (eg: Rank = 3, Dimensions = {4, 5, 6})
|  |  +-- Datatype (eg: Integer)
|  |  +-- Properties (eg: Chuncked, Compressed)
|  |  +-- Attributes (eg: attr1 = 32.4, attr2 = "hello", ...)
|

從上面的結(jié)構(gòu)中可以看出:

  • Dataspace 給出原始數(shù)據(jù)的秩 (Rank) 和維度 (dimension)
  • Datatype 給出數(shù)據(jù)類型
  • Properties 說(shuō)明該 dataset 的分塊儲(chǔ)存以及壓縮情況
  • Chunked: Better access time for subsets; extendible
  • Chunked & Compressed: Improves storage efficiency, transmission speed
  • Attributes 為該 dataset 的其他自定義屬性
     

整個(gè) HDF5 文件的結(jié)構(gòu)如下所示:

+-- /
|  +-- group_1
|  |  +-- dataset_1_1
|  |  |  +-- attribute_1_1_1
|  |  |  +-- attribute_1_1_2
|  |  |  +-- ...
|  |  |
|  |  +-- dataset_1_2
|  |  |  +-- attribute_1_2_1
|  |  |  +-- attribute_1_2_2
|  |  |  +-- ...
|  |  |
|  |  +-- ...
|  |
|  +-- group_2
|  |  +-- dataset_2_1
|  |  |  +-- attribute_2_1_1
|  |  |  +-- attribute_2_1_2
|  |  |  +-- ...
|  |  |
|  |  +-- dataset_2_2
|  |  |  +-- attribute_2_2_1
|  |  |  +-- attribute_2_2_2
|  |  |  +-- ...
|  |  |
|  |  +-- ...
|  |
|  +-- ...
|

一個(gè) HDF5 文件從一個(gè)命名為 "/" 的 group 開始,所有的 dataset 和其它 group 都包含在此 group 下,當(dāng)操作 HDF5 文件時(shí),如果沒有顯式指定 group 的 dataset 都是默認(rèn)指 "/" 下的 dataset,另外類似相對(duì)文件路徑的 group 名字都是相對(duì)于 "/" 的。

安裝

pip install h6py

Python讀寫HDF5文件

#!/usr/bin/python
# -*- coding: UTF-8 -*-
#
# Created by WW on Jan. 26, 2020
# All rights reserved.
#

import h6py
import numpy as np

def main():
  #===========================================================================
  # Create a HDF5 file.
  f = h6py.File("h6py_example.hdf5", "w")  # mode = {'w', 'r', 'a'}

  # Create two groups under root '/'.
  g1 = f.create_group("bar1")
  g2 = f.create_group("bar2")

  # Create a dataset under root '/'.
  d = f.create_dataset("dset", data=np.arange(16).reshape([4, 4]))

  # Add two attributes to dataset 'dset'
  d.attrs["myAttr1"] = [100, 200]
  d.attrs["myAttr2"] = "Hello, world!"

  # Create a group and a dataset under group "bar1".
  c1 = g1.create_group("car1")
  d1 = g1.create_dataset("dset1", data=np.arange(10))

  # Create a group and a dataset under group "bar2".
  c2 = g2.create_group("car2")
  d2 = g2.create_dataset("dset2", data=np.arange(10))

  # Save and exit the file.
  f.close()

  ''' h6py_example.hdf5 file structure
  +-- '/'
  |  +--  group "bar1"
  |  |  +-- group "car1"
  |  |  |  +-- None
  |  |  |  
  |  |  +-- dataset "dset1"
  |  |
  |  +-- group "bar2"
  |  |  +-- group "car2"
  |  |  |  +-- None
  |  |  |
  |  |  +-- dataset "dset2"
  |  |  
  |  +-- dataset "dset"
  |  |  +-- attribute "myAttr1"
  |  |  +-- attribute "myAttr2"
  |  |  
  |  
  '''

  #===========================================================================
  # Read HDF5 file.
  f = h6py.File("h6py_example.hdf5", "r")  # mode = {'w', 'r', 'a'}

  # Print the keys of groups and datasets under '/'.
  print(f.filename, ":")
  print([key for key in f.keys()], "\n") 

  #===================================================
  # Read dataset 'dset' under '/'.
  d = f["dset"]

  # Print the data of 'dset'.
  print(d.name, ":")
  print(d[:])

  # Print the attributes of dataset 'dset'.
  for key in d.attrs.keys():
    print(key, ":", d.attrs[key])

  print()

  #===================================================
  # Read group 'bar1'.
  g = f["bar1"]

  # Print the keys of groups and datasets under group 'bar1'.
  print([key for key in g.keys()])

  # Three methods to print the data of 'dset1'.
  print(f["/bar1/dset1"][:])    # 1. absolute path

  print(f["bar1"]["dset1"][:])  # 2. relative path: file[][]

  print(g['dset1'][:])    # 3. relative path: group[]
  # Delete a database.
  # Notice: the mode should be 'a' when you read a file.
  '''
  del g["dset1"]
  '''

  # Save and exit the file
  f.close()

if __name__ == "__main__":
  main()

相關(guān)代碼示例

創(chuàng)建一個(gè)h6py文件

import h6py
f=h6py.File("myh6py.hdf5","w")

創(chuàng)建dataset

import h6py
f=h6py.File("myh6py.hdf5","w")
#deset1是數(shù)據(jù)集的name,(20,)代表數(shù)據(jù)集的shape,i代表的是數(shù)據(jù)集的元素類型
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]

賦值

import h6py
import numpy as np
f=h6py.File("myh6py.hdf5","w")

d1=f.create_dataset("dset1",(20,),'i')
#賦值
d1[...]=np.arange(20)
#或者我們可以直接按照下面的方式創(chuàng)建數(shù)據(jù)集并賦值
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]

創(chuàng)建group

import h6py
import numpy as np
f=h6py.File("myh6py.hdf5","w")

#創(chuàng)建一個(gè)名字為bar的組
g1=f.create_group("bar")

#在bar這個(gè)組里面分別創(chuàng)建name為dset1,dset2的數(shù)據(jù)集并賦值。
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]]

刪除某個(gè)key下的數(shù)據(jù)

# 刪除某個(gè)key,調(diào)用remove
f.remove("bar")

最后pandsa讀取HDF5格式文件

import pandas as pd
import numpy as np

# 將mode改成r即可
hdf5 = pd.HDFStore("hello.h6", mode="r")
# 或者
"""
hdfs = pd.read_hdf("hello.h6", key="xxx")
"""

以上就是HDF5文件如何利用Python實(shí)現(xiàn)存儲(chǔ)或讀取,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見到或用到的。希望你能通過(guò)這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI