HDF5 (.h5, .hdf5)

背景

    • MIME 类型: application/x-hdf5
    • HDF 数据格式版本 5.
    • 表示多维数据集和图像的通用格式.
    • 支持有复合数据机构的数据集.
    • 用于存储、管理和交换科学数据.
    • HDF 是 Hierarchical Data Format(分层数据格式)的缩写.
    • 由美国国家超级计算应用中心(NCSA)开发.
    • 目前由 HDF 团队维护.
    • 二进制文件格式.
    • 不与 HDF 版本 4 及早期版本兼容.

Import 与 Export

  • Import["file.h5"] 导入一个 HDF5 文件,返回存储在文件中的数据集名称.
  • Import["file.h5",elem] 从一个 HDF5 文件中导入指定的参数.
  • 导入格式可以由 Import["file","HDF5"]Import["file",{"HDF5",elem,}] 指定.
  • Export["file.h5",expr] 将一个数值数组导出到 HDF5.
  • Export["file.h5",{expr1,},{"Datasets", {"dataset1",}}] 创建一个 HDF5 文件,将数组{expr1,} 存储为单独的数据集.
  • Export["file.h5",expr,elem] 将指定参数导出至 HDF5 文件.
  • Export["file.h5",elem1->expr1,,"Rules"] 使用规则指定要导出的参数.
  • 请到以下参考页面了解完整的基本信息:
  • Import, Export从文件导入或导出到文件
    CloudImport, CloudExport从云对象导入或导出到云对象
    ImportString, ExportString从字符串导入或导出到字符串
    ImportByteArray, ExportByteArray从字节数组导入或导出到字节数组

Import 参数

  • 通用 Import 参数:
  • "Elements" 该文件可用的参数和选项列表
    "Summary"文件摘要
    "Rules"所有可用参数的规则列表
  • 结构参数:
  • "Datasets"所有数据集的名称
    "Groups"所有分组的名称
    "StructureGraph"直接显示数据集结构的图
    {"StructureGraph, groupname}显示 groupname 以下结构的图
    "StructureGraphLegend"结构图的标签
    "Summary"属性摘要
  • 分组和数据集的名称作为以 "/" 开始的根组名称的绝对路径给出.
  • 默认情况下,对于 HDF5 格式,Import 使用 "Datasets" 参数.
  • 表示数据的参数:
  • "Data"以数组列表形式导入的所有数据集
    {"Data",n}nn 个数据集
    {"Data",dataset}dataset已命名的数据集
    {"Data",groupname}groupname 以下所有数据集的关联
    {"Data",groupname,lev}groupname 以下 lev 等级为止所有数据集的关联
  • 支持以下基本数据类型:
  • "Integer8"8 位整数
    "Integer16"16 位整数
    "Integer32"32 位整数
    "Integer64"64 位整数
    "UnsignedInteger8"8 位无符号整数
    "UnsignedInteger16"16 位无符号整数
    "UnsignedInteger32"32 位无符号整数
    "UnsignedInteger64"64 位无符号整数
    "Real32"IEEE 单精度数
    "Real64"IEEE 双精度数
    "String"ASCII 字符的字符串
  • 支持以下结构的数据类型:
  • "ByteArray"任意长度的 ByteArray
    "Array"任何所支持数据格式的数组
    "Enum"枚举类型
    "Compound"任何其他数据格式和其他复合数据集组成的复合数据集
  • 复数通常作为复合类型储存和导入.
  • 元数据参数:
  • "Attributes"所有分组和数据集的属性
    "DataEncoding"指定每个数据集如何被压缩
    "DataFormat"用于表示每个数据集的类型
    "Dimensions"每个数据集的数据维度
    {"metadata",n}n 个数据集的元数据
    {"metadata",dataset}metadata of the named dataset
  • 支持以下数据编码:
  • None无数据压缩使用
    "Fletcher32"添加 Fletcher 校验和
    "GZIP"GZIP 压缩
    "ScaleOffset"执行度量和/或补偿操作
    "Shuffle"重排序使连续位数的位置放置在一起
    "SZIP"SZIP 压缩(只用于 Import
  • 单独数据集可以有多种编码,其被指定为列表 {enc1,enc2,}.

Export 参数

  • 通用 Export 参数:
  • "Rules"elemexpr 形式的导入元素列表
  • Export["file.h5",{elem1->expr1,},"Rules"] 使用规则指定要导出的参数.
  • 可用的 Export 参数:
  • "Attributes"与任何对象关联的属性
    "Datasets"数据集以及其相关联参数
    "Groups"分组名称和其相关联的参数
    "NamedDataTypes"已命名的数据类型和其相关联的参数
  • "Attributes" 参数,可给出以下表达式:
  • attr与根组 "/" 相关联的属性
    {path1attr1,}与指定 pathi 相关联的属性 attri
  • 属性 attri 应以 "attname"->attval 格式给出.
  • "Groups" 参数,可给出以下表达式:
  • {"gr1","gr2",}一个分组路径列表
    {"gr1"grdata1,}一个分组列表和其相关联数据
  • 分组数据 grdatai 可使用以下键:
  • "Attributes"分组属性
    "HardLinks"与其他对象的硬链接
    "SoftLinks"与其他对象的软链接
  • 软硬链接可用 "linkname"path 指定.
  • "Datasets" 参数,可给出以下表达式:
  • datadata 存储于 "Dataset1"
    {"name1"data1,}一个数据集名称列表及其相关联数据
    {"name1"ds1,}用一个规则列表指定每个数据集 dsi
  • 数据集 dsi 可使用以下键:
  • "Attributes"数据集属性
    "Data"数据数组
    "DataFormat"数据类型
    "MaxDimensions"数据集的最大尺寸列表
    "SpaceSelection"数据空间中将要写入数据的部分
  • "NamedDataTypes" 参数,可给出以下表达式:
  • {"name1"type1,}一个数据类型
    {"name1"<|"Type"type1,"Attributes"att1|>,}一个关联指定一种类型和其属性
  • 类型规范 typei 可使用以下格式:
  • "simpletype"一个简单数据类型,例如 "Integer64"
    <|"Class""ByteArray",|>使用 "Length""Tag"
    <|"Class""Array",|>使用 "DataFormat""Dimensions"
    <|"Class""Compound",|>使用一个 "Structure"

选项

  • ImportExport 选项:
  • "ComplexKeys"Automatic用于复杂解释和导出的键
  • 在默认情况下,{"Re","Im"} 使用复杂键. 其他设定包括:
  • None无复杂解释(仅导入)
    Automatic使用自动键
    {key1,key2}使用显式键
  • Import 选项:
  • "TakeElements"All需导入的参数子集
  • "TakeElements" 可以处理一下值:
  • {elem1,elem2,}参数 elemi 列表
    {m;;n;;s,...}在步长 s 下,从 mn 的参数
    {opt1val1,}子选项列表
  • 在选取参数时可用以下子选项 opti
  • "Offset"{0,0,}沿数据集维数的补偿
    "Count"All沿每个维数导入的块数
    "Stride"{1,1,}每个起始块间的步长
    "Block"{1,1,}每个块的参数数目
  • Export 选项:
  • ByteOrdering$ByteOrdering使用何种字节顺序
    OverwriteTargetTrue是否覆盖已有文件
    "AppendMode""Extend"如何附加于已有对象
  • OverwriteTarget->"Append",新对象有可能被添加于已有文件.
  • 用于 "AppendMode" 的可能设定包括:
  • "Extend"扩展已有对象,如果可能(默认)
    "Overwrite"覆盖已有对象
    "Preserve"保留已有对象

范例

打开所有单元关闭所有单元

基本范例  (1)

显示存储在样本文件中的数据集:

获取文件摘要:

显示文件结构:

范围  (12)

Import  (7)

显示文件中的所有可用元素:

在默认情况下,a list of dataset names is returned:

导入文件结构,明确指定格式:

通过指定数据名称来导入数据集的内容:

导入文件中所有数据集的维度和数据格式:

导入单个数据集的维度和数据格式:

导入 8 位 RGB 光栅数据并将它渲染为一个 Image 对象:

Export  (5)

将矩阵导出为 HDF5:

显示文件中包含的数据集:

导出一个已命名的数据集:

将两个矩阵导出为 HDF5:

导出具有给定数据类型的命名数据集:

导入数据格式:

导出指定的数据类型和链接到其分组:

导入文件结构:

导入参数  (22)

Attributes  (4)

导入文件中所有对象的属性:

导入指定数据集的属性:

导入文件中第二个数据集的属性:

可通过读出检查书籍的排序:

导入多个对象的属性:

Data  (4)

获取文件中所有数据集的数据:

从 "Complex" 分组中的数据集 "Complex64" 导入数据:

从文件中的第三个数据集导入数据:

从给定分组的数据集获取数据:

从列表中的每个数据集或分组中导入数据:

DataEncoding  (1)

检查对文件中的每个数据集应用了哪种过滤器:

DataFormat  (2)

获取文件中所有数据集的数据类型描述:

简单数值和字符串类可用一个单词描述:

"DataFormat" 对于复合类型显示分类和结构:

"DataFormat" 对于枚举类型包括了分类、基本数据格式和数值和名称的列表:

"DataFormat" 对于数组类型包括分类、基本数据格式和维数:

"DataFormat" 对于位数数组包括了分类和长度:

Datasets  (2)

导入文件中的所有数据集名称:

"Datasets" 是默认的 HDF5 参数:

Dimensions  (4)

获取文件中所有数据集的维数:

导入在给定分组下的所有数据集维数:

用空列表表示仅有单个参数的数据维数:

获取给定数据集的维数:

使用索引指定数据集:

Groups  (1)

导入文件中的所有分组名称,每个分组仅列出一次:

StructureGraph  (3)

有结构的 HDF5 文件的结构:

平面 HDF5 文件的结构:

获取标签:

Summary  (1)

获取文件摘要:

导出参数  (28)

Attributes  (4)

将属性附加到根组:

指定属性的数据格式:

在 "Datasets" 和 "Attributes" 元素中导出数据集的属性:

每个属性必须有一个名称,该名称在附加到同一对象的所有属性中是唯一的:

尝试使用已经存在的名称导出不同的属性:

可以通过将 "AppendMode" 设置为 "Overwrite" 来覆盖现有属性:

Datasets  (13)

"Datasets" 是默认的导出参数. 数据格式和维数自动从表达式推断:

将表达式导出为不同数据集,其中每个都含有完整路径:

检查 HDF5 文件的结构:

导出有自定义数据结构的数据集:

导出有属性的数据集:

使用单个整数创建标量数据集:

创建一个整数数组:

导出实数数组:

导出具有复数的数字数组:

注意复数将导出到一个复合数据集:

"ComplexKeys" 选项可以获得复数:

使用字符串创建数据集:

ByteArray 被存储为 "ByteArray" 类型(在 HDF5 中另成为隐含类型):

与字符串键的关联将导出为复合类型的元素:

创建一个初始大小为 2×2 的数据集,以后可以扩展到 10 行和任意多列:

用 5 个整数的列表覆盖第一行。这会将数据集扩展到 5 列:

使用 "SpaceSelection" 子元素覆盖第三列和第四列:

创建一个可以任意扩展的 3×4 数据集:

附加一个 3×3 数组. 这只能沿着第一个维度完成, Export 将自动检测到:

有时数据维度不允许自动扩展数据集:

在这种情况下,可以手动指定 "SpaceSelection":

Groups  (9)

HDF5 文件始终具有根组(带有 "/" 的路径):

通过提供路径列表导出多个组:

分组可以包含指向其他分组或数据集的链接:

软链接名称不能包含特殊字符 "/"

软链接目标必须是有效路径,不含有 "." ".."

如果软链接对象缺失,则链接变成悬空:

创建两个分组的文件, 从一个分组到数据集的数据集和一个硬链接:

无法添加指向不存在位置的硬链接:

在 "/A/newDset" 下新建一个数据集:

尝试重定向 "newDset" 链接指向组 "B":

只有 "Overwrite" 模式下才行:

现在对第二个数据集的访问不可逆转地丢失了。这是资源泄漏,因为数据集仍在文件中占用空间。

与软链接一样,硬链接名称始终与组路径相关,并且必须仅包含一个路径元素:

硬链接对象必须为有效路径,不含 "." 或 "..":

NamedDatatypes  (2)

将简单类型到处至文件:

将名为 compound 的数据类型附加到同一文件:

在导出数据集的时候使用之前导出的类型:

导入数据集的格式和维数:

检查导出数据:

命名数据类型可以携带属性:

导入选项  (4)

"ComplexKeys"  (1)

HDF5 没有用于复数的内置类型。通常它们以复合类型存储:

指定要解释为复数的实部和虚部的键:

"TakeElements"  (3)

从数据集导入三个点:

这与导入整个数据集后提取部分相同但效率更高:

使用跨度从数据集导入一个范围的数据:

使用子选项指定 offset、stride 和 block:

导出选项  (8)

"AppendMode"  (1)

使用 OverwriteTarget"Append",将数据附加到现有文件时,可以使用 "AppendMode" 选项指定附加数据的导出行为。默认情况下,使用"AppendMode""Extend".

创建一个简单的文件:

添加一个新组:

追加新数据集:

将一些属性附加到 "gr1/ds1" ,以及从 "gr1" 到 "gr2" 的硬链接:

"AppendMode""Extend" 不允许修改现有属性或链接:

"AppendMode""Overwrite",可以覆盖现有对象并添加新对象:

"AppendMode""Overwrite",只要数据格式和维度匹配,就可以修改现有数据集中的数据:

要将新对象附加到文件并保证不会修改文件中的现有结构,使用 "AppendMode""Preserve":

ByteOrdering  (1)

HDF5 允许您选择字节顺序. 用 ByteOrdering-1 创建一个大字端文件:

创建一个小字端文件:

这两个文件实际上是不同的:

Import 将独立于字节顺序正常工作:

"ComplexKeys"  (3)

默认情况下,复数使用 "Re" 和 "Im" 键导出为复合类型:

指定不同的键:

若要将数据导入为复数,请在 Import 中指定键:

密钥必须不同:

OverwriteTarget  (3)

默认情况下,当 OverwriteTargetTrue,每次调用 Export 都会写入一个新文件:

OverwriteTargetFalse,如果输出文件已经存在,对 Export 的调用将失败:

导出为某些格式,例如HDF5,支持设置 OverwriteTarget"Append",这使得 Export 作用于输出文件(如果它已经存在),而不是覆盖:

属性和关系  (1)

在默认情况下,关联导出为复合数据集:

规则列表将导出为多个数据集:

可能存在的问题  (1)

"Groups" 仅列出一次文件中的每个分组:

注意 "/group2" 是文件中未被列出的有效路径:

使用未列出分组的路径: