有人在 Mathematica 中有解决方法来读取 HDF5 复合数组吗?我在表格中有一个简单的 2D 复合类型(int/float),但它目前被忽略了。
一个示例 HDF5 类型可能是:
DATATYPE H5T_COMPOUND {
H5T_IEEE_F32LE "X";
H5T_IEEE_F32LE "Y";
}
有人在 Mathematica 中有解决方法来读取 HDF5 复合数组吗?我在表格中有一个简单的 2D 复合类型(int/float),但它目前被忽略了。
一个示例 HDF5 类型可能是:
DATATYPE H5T_COMPOUND {
H5T_IEEE_F32LE "X";
H5T_IEEE_F32LE "Y";
}
有一个包,显然是由 Scot Martin在这里创建的。
据我所知,它实现了很多 HDF5 功能,包括复合类型。
这是包中的一个简短片段11 HDF5HighLevel Examples.nb
:
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}
*)
!
我创建h5dumpImport
了一个开源Mathematica包,它提供了一种独立于平台的方式来导入具有复合数据类型的 HDF5 (.h5) 文件的数据集,同时对用户隐藏了大部分 HDF5 实现。包含文档、示例和单元测试的包位于此处。
目前,该h5dumpImport
包不直接导入 HDF5 (.h5) 文件格式。该包导入由命令行工具h5dumpImport
生成的数据集的 ASCII 转储。h5dump
包含命令行工具的 HDF5 软件的源代码和预构建的二进制分发h5dump
可以在 HDF 集团的网站上找到。
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"}}
从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"|>
|>
|>
|>