Mathematica HDF5 和复合阵列

Posted

技术标签:

【中文标题】Mathematica HDF5 和复合阵列【英文标题】:Mathematica HDF5 and compound arrays 【发布时间】:2011-05-27 20:45:36 【问题描述】:

是否有人在 Mathematica 中有解决方法来读取 HDF5 复合数组?我在表格中有一个简单的 2D 复合类型(int/float),但它目前被忽略了。

一个示例 HDF5 类型可能是:

DATATYPE H5T_COMPOUND 
    H5T_IEEE_F32LE "X";
    H5T_IEEE_F32LE "Y";

【问题讨论】:

能否请您发布您的数据结构? 另外请注意,根据帮助(虽然不是很清楚),您只能在数据集级别指定“DataFormat”。 编辑为包含 HDF5 类型。 遇到以下情况。它很旧,你可能知道它。 thedailyreviewer.com/compsys/view/hdf5-broken-in-v7-10897059 。在 v6 中看起来不错?这个错误是否仍然存在于 v8 中? 我没有复制这个错误 - 但谢谢。问题是 Mathematica 不能明确地导入复合类型。 【参考方案1】:

它appears 版本 8 仍然忽略复合数据类型。但是,从第 8 版开始,另一种方法可能是创建一个可以加载复合数据类型的Import Converter。这可能意味着您将不得不重新实现 HDF5 导入器,但我还没有尝试过。我仍在使用 7,但我想要这种功能很久了。

【讨论】:

如果有人写了一个 Importer Converter,请分享! @belisarius 感谢您通知我!【参考方案2】:

有一个包,显然是由 Scot Martin here 创建的。

据我所知,它实现了很多 HDF5 功能,包括复合类型。

这是来自11 HDF5HighLevel Examples.nb 的一个简短的sn-p 在包中:

With[
 
  file = FileNameJoin[Directory[], subfolderWithExamples, "h5ex_t_cmpd.h5"],
  dataSet = "DS1"
  ,
 CompoundDataType`Information[file, dataSet]
 ]
(*
"DataSpaceDimensions" -> 4, 
 "MemberDataTypeClass" -> 0, -3, 1, 1,  
 "MemberMemorySize" -> 8, 8, 8, 8, 
 "MemberName" -> "Serial number"  , "Location", 
                  "Temperature (F)", "Pressure (inHg)",  
 "MemberOffset" -> 0, 8, 20, 28, 
 "MemberSize" -> 8, 8, 8, 8, 
 "MemoryDataTypeSize" -> 32, 
 "NumberOfMembers" -> 4
*)

HTH!

【讨论】:

【参考方案3】:

我创建了h5dumpImport,这是一个开源的Mathematica包,它提供了一种独立于平台的方式来导入具有复合数据类型的 HDF5 (.h5) 文件的数据集,同时对用户隐藏了大部分 HDF5 实现.包含文档、示例和单元测试的软件包位于 here。

目前,h5dumpImport 包不直接导入 HDF5 (.h5) 文件格式。 h5dumpImport 包导入由h5dump 命令行工具生成的数据集的 ASCII 转储。

包含h5dump 命令行工具的 HDF5 软件的源代码和预构建二进制分发版可在 HDF 集团的website 找到。

基本示例

Needs["h5dumpImport`"]
datasets = Import["testData.h5", "Datasets"];
dumpFile = h5dump["/usr/bin/h5dump", "testData.h5", datasets[[1]]];
dumpImport = h5dumpImportNew[h5dumpImport[], dumpFile];
dumpImport.h5dumpImportData[All]
dumpImport.h5dumpImportClose[];

结果:

1, 11, 111, 1111, 11111, 111111, 1111111, 1.1, 11.11, "one",
 2, 22, 222, 2222, 22222, 222222, 2222222, 2.2, 22.22, "two",
 3, 33, 333, 3333, 33333, 333333, 3333333, 3.3, 33.33, "three"

可以在here找到详细的安装说明、使用信息以及文档、示例和单元测试。

【讨论】:

【参考方案4】:

11.1 版本开始导入 HDF5 文件可以处理复合类型(甚至嵌套),并将它们转换为关联。

示例文件 ExampleData/sample2.h5 包含一个名为 /Compound 的数据集,其中包含一个 2x2 的复合元素矩阵。您可以像这样导入数据:

In[3]:= Import["ExampleData/sample2.h5", "/Compound"]

Out[3]= 
  
    <|
      "Country" -> "Botswana", 
      "Military" -> 5.3, 4.5, 
      "Elevation" -> <|"Max" -> 4892, "Min" -> 513, "Highest point" -> "Otse Hill"|>
    |>,
    <|
      "Country" -> "Chile", 
      "Military" -> 8.8, 3.7, 
      "Elevation" -> <|"Max" -> 6893, "Min" -> 0, "Highest point" -> "Ojos del Salado"|>
    |>
  , 
    <|
      "Country" -> "France", 
      "Military" -> 5.3, 3.3, 
      "Elevation" -> <|"Max" -> 4810, "Min" -> -10, "Highest point" -> "Mont Blanc"|>
    |>, 
    <|
      "Country" -> "Laos", 
      "Military" -> 18.9, 4.3, 
      "Elevation" -> <|"Max" -> 2817, "Min" -> 70, "Highest point" -> "Phou Bia"
    |>
  |>

要了解有关特定数据集的复合数据类型的更多信息,您可以查看DataFormat 元素:

In[2]:= Import["ExampleData/sample2.h5", "DataFormat", "/Compound"]

Out[2]= <|
  "Class" -> "Compound", 
  "Structure" -> <|
    "Country" -> "String", 
    "Military" -> <|"Class" -> "Array", "Dimensions" -> 2, "DataFormat" -> "Real64"|>, 
    "Elevation" -> <|
      "Class" -> "Compound", 
      "Structure" -> <|"Max" -> "Integer16", "Min" -> "Integer16", "Highest point" -> "String"|>
    |>
  |>
|>

【讨论】:

以上是关于Mathematica HDF5 和复合阵列的主要内容,如果未能解决你的问题,请参考以下文章

如何在 HDF5 C# 上创建复合数据集

通过 h5py (HDF5) 写入具有可变长度字符串的复合数据集

HDF5:复合数据类型,用于写入包含指向另一个结构的指针的结构

是否可以从 Python 的 HDF5 文件中的复合数据集中读取字段名称?

HDF5 中的嵌套复合数据类型

HDF5Cpp 扩展复合数据集 Hyperslab 问题