HDF(Hierarchical Data Format)指一种为存储和处理大容量科学数据设计的文件格式及相应库文件。HDF 最早由美国国家超级计算应用中心 NCSA 开发,目前在非盈利组织 HDF 小组维护下继续发展。当前流行的版本是 HDF5。HDF5 拥有一系列的优异特性,使其特别适合进行大量科学数据的存储和操作,如它支持非常多的数据类型,灵活,通用,跨平台,可扩展,高效的 I/O 性能,支持几乎无限量(高达 EB)的单文件存储等。

HDF5文件层次化的存储两类对象:

  • dataset:数据集,一个数据集就是一个数组。数据集就是叶子节点,是文件结点。
  • group:目录,一个group可以包含若干个key-value,其中key是字符串,value是dataset。

这两类对象都可以设置各种属性,属性用于描述group和dataset的一些特点。一个HDF5文件从一个命名为“/”的group开始,一个HDF5文件只有一个根group。

用 h5py 操作 HDF5 文件,我们可以像使用目录一样使用 group,像使用 numpy 数组一样使用 dataset,像使用字典一样使用属性,非常方便和易用。

打开/创建

class File(name, mode=None, driver=None, libver=None, userblock_size=None, **kwds)

打开或创建一个 HDF5 文件,name 为文件名字符串,mode 为打开文件的模式,driver 可以指定一种驱动方式,如需进行并行 HDF5 操作,可设置为 'mpio',libver 可以指定使用的兼容版本,默认为 'earliest',也可以指定为 'latest',userblock_size 以字节为单位指定一个在文件开头称作 user block 的数据块,一般不需要设置。返回所打开文件的句柄。

mode 说明
r 只读,文件必须存在
r+ 读写,文件必须存在
w 创建新文件写,已经存在的文件会被覆盖掉
w- / x 创建新文件写,文件如果已经存在则出错
a 打开已经存在的文件进行读写,如果不存在则创建一个新文件读写,此为默认的 mode

创建group

create_group(self, name, track_order=False)

创建一个新的 group。以类似目录路径的形式指明所创建 group 的名字 name,如果 track_order 为 True,则会跟踪在当前 group 下的 group 和 dataset 创建的先后顺序。该方法可以在打开的文件句柄(相当于 "/" group)或者一个存在的 group 对象上调用,此时 name 的相对路径就是相对于此 group 的。

创建dataset

create_dataset(self, name, shape=None, dtype=None, data=None, **kwds)

创建一个新的 dataset。以类似文件路径的形式指明所创建 dataset 的名字 name,shape 以一个 tuple 或 list 的形式指明创建 dataset 的 shape,用 "()" 指明标量数据的 shape,dtype 指明所创建 dataset 的数据类型,可以为 numpy dtype 或者一个表明数据类型的字符串,data 指明存储到所创建的 dataset 中的数据。如果 data 为 None,则会创建一个空的 dataset,此时 shape 和 dtype 必须设置;如果 data 不为 None,则 shape 和 dtype 可以不设置而使用 data 的 shape 和 dtype,但是如果设置的话,必须与 data 的 shape 和 dtype 兼容。

添加attribute

打开的文件句柄(相当于 "/" group),group 和 dataset 上都可以创建 attribute,以类似于字典的操作方式创建和读取 attribute。

示例代码一:

import h5py
import numpy as np X = np.random.rand(1, 10, 4).astype('float32')
y = np.random.rand(1, 10, 5).astype('float32') h5f = h5py.File('data.h5', 'w') # 以写模式打开文件
h5f.create_dataset('X_train', data=X) # 添加数据集
h5f.create_dataset('y_train', data=y) # 添加数据集
h5f.close() h5f = h5py.File('data.h5', 'r') # 以读模式打开文件
X = h5f['X_train'] # 通过下标方式获取数据集
Y = h5f['y_train']
h5f.close()

示例代码二:

import os

import h5py
import numpy as np file_name = 'test.hdf5'
# create a new HDF5 file
f = h5py.File(file_name)
# create a new group
f.create_group('/grp1') # or f.create_group('grp1')
# create a nother group inside grp1
f.create_group('/grp1/grp2') # or f.create_group('grp1/grp2')
# create a dataset in group "/"
data = np.arange(6).reshape(2, 3)
f.create_dataset('dset1', data=data) # or f.create_dataset('/dset1', data=data)
# create another dataset in group /grp1
f.create_dataset('grp1/dset2', data=data) # or f.create_dataset('/grp1/dset2', data=data)
# create an attribute of "/"
f.attrs['a'] = 1 # or f.attrs['/a'] = 1
# create an attribute of group "/grp1"
f['grp1'].attrs['b'] = 'xyz'
# create an attribute of dataset "/grp1/dset2"
f['grp1/dset2'].attrs['c'] = np.array([1, 2])
# close file
f.close() # open the existing test.hdf5 for read only
f = h5py.File(file_name, 'r')
# read dataset /dset1
print('/dset1 = %s' % f['dset1'][:])
# read dataset /grp1/dset2
print('/grp1/dset2 = %s' % f['/grp1/dset2'][:])
# get attributes
print(f.attrs['a'])
print(f['grp1'].attrs['b'])
print(f['grp1/dset2'].attrs['c']) # remove the created file
os.remove(file_name)

示例代码三:

import h5py
import numpy as np file_name = 'test.hdf5'
f = h5py.File(file_name, mode='w')
data = np.array([1, 2, 3])
f['/one'] = data
f.attrs['one'] = 'haha'
print(f.attrs.keys())
print(f['one'])
print(f.attrs['one'])

参考资料

http://docs.h5py.org/en/stable/quick.html

http://www.h5py.org/

https://www.jianshu.com/p/de9f33cdfba0

使用h5py操作hdf5文件的更多相关文章

  1. 使用python操作HDF5文件

    HDF Hierarchical Data Format,又称HDF5 在深度学习中,通常会使用巨量的数据或图片来训练网络.对于如此大的数据集,如果对于每张图片都单独从硬盘读取.预处理.之后再送入网络 ...

  2. (数据科学学习手札63)利用pandas读写HDF5文件

    一.简介 HDF5(Hierarchical Data Formal)是用于存储大规模数值数据的较为理想的存储格式,文件后缀名为h5,存储读取速度非常快,且可在文件内部按照明确的层次存储数据,同一个H ...

  3. 【Python系列】HDF5文件介绍

    一个HDF5文件是一种存放两类对象的容器:dataset和group. Dataset是类似于数组的数据集,而group是类似文件夹一样的容器,存放dataset和其他group.在使用h5py的时候 ...

  4. c++ 读取不了hdf5文件中的字符串

    问题描述: 在拿到一个hdf5文件,想用c++去读取文件中的字符串,但是会报错:read failed ps: c++读取hdf5的字符串方法见:https://support.hdfgroup.or ...

  5. Pythond 读写HDF5文件

    HDF(Hiearchical Data Format)是一种针对大量数据进行组织和存储的文件格式,可以存储不同类型的图像和数码数据的文件格式,并且可以在不同类型的机器上传输. HDF是美国国家高级计 ...

  6. 【Python 代码】生成hdf5文件

    import random from PIL import Image import numpy as np import os import h5py from PIL import Image L ...

  7. Asp.Net 操作XML文件的增删改查 利用GridView

    不废话,直接上如何利用Asp.NET操作XML文件,并对其属性进行修改,刚开始的时候,是打算使用JS来控制生成XML文件的,但是最后却是无法创建文件,读取文件则没有使用了 index.aspx 文件 ...

  8. php多线程操作同一文件-待续

    同意文件操作同意文件的问题在于逻辑有些地方不合适,如果多个线程同时写入,在不加锁的情况下,可能导致得到结果不如意,为了安全,和脏读(数据库的词),应该使用排他锁,这就意味着每次只能被一个线程操作.其他 ...

  9. Java生成和操作Excel文件(转载)

    Java生成和操作Excel文件   JAVA EXCEL API:是一开放源码项目,通过它Java开发人员可以读取Excel文件的内容.创建新的Excel文件.更新已经存在的Excel文件.使用该A ...

随机推荐

  1. Remmarguts' Date POJ - 2449 (A*搜索|k短路)

    "Good man never makes girls wait or breaks an appointment!" said the mandarin duck father. ...

  2. vue中的页面渲染方案

    一.模板渲染 <div id="J_render_app"> <ul v-if="items.length"> <li v-for ...

  3. 双向BFS—>NOIP2002 字串变换

    如果目标也已知的话,用双向BFS能很大提高速度 单向时,是 b^len的扩展. 双向的话,2*b^(len/2)  快了很多,特别是分支因子b较大时 至于实现上,网上有些做法是用两个队列,交替节点搜索 ...

  4. 树形动态规划(树状DP)小结

    树状动态规划定义 之所以这样命名树规,是因为树形DP的这一特殊性:没有环,dfs是不会重复,而且具有明显而又严格的层数关系.利用这一特性,我们可以很清晰地根据题目写出一个在树(型结构)上的记忆化搜索的 ...

  5. 初窥Java--2(下载Eclipse,安装tomcat插件)

    一.软件下载 Eclipse3.6 IDE for Java EE Developers: 下载地址:http://eclipse.org/downloads/ Tomcat Eclipse Plug ...

  6. 要过年啦,用canvas做了个烟火效果

    声明:本文为原创文章,如需转载,请注明来源WAxes,谢谢! 要过年了,过年想到的就是放烟火啦....于是就用canvas写了个放烟火的效果,鼠标点击也会产生烟火,不过不要产生太多烟火哦,一个烟火散出 ...

  7. HDU 2002 计算球体积

    题目链接:HDU 2002 Description 根据输入的半径值,计算球的体积. Input 输入数据有多组,每组占一行,每行包括一个实数,表示球的半径. Output 输出对应的球的体积,对于每 ...

  8. react-native 报错 RawText "" must be wrapped in an explicit <Text> component

    刚才又遇到了一个坑,找了好久,问题如下: 开始以为是Text标签怎么有问题了,结果是下面的原因影响的: 上图第二行,标签和注释中间多了一个空格,就会报这个错误. 解决办法 1.将空格删掉 <Re ...

  9. 概率图模型 基于R语言 这本书中的第一个R语言程序

    概率图模型 基于R语言 这本书中的第一个R语言程序 prior <- c(working =0.99,broken =0.01) likelihood <- rbind(working = ...

  10. web的几种返回顶部

    回到顶部backtoTop 滚动回到顶部 jquery/js效果还不错!支持现代浏览器包括 ie6.position: absolute;和fixed.两种方法! 一,jQuery方法的backtoT ...