Mathematica HDF5 и составные массивы - PullRequest
6 голосов
/ 19 декабря 2010

Есть ли у кого-нибудь обходной путь в Mathematica для чтения составных массивов HDF5?У меня есть простой двумерный составной тип (int / float) в таблице, но в настоящее время он игнорируется.

Примером типа HDF5 может быть:

DATATYPE H5T_COMPOUND {
    H5T_IEEE_F32LE "X";
    H5T_IEEE_F32LE "Y";
}

Ответы [ 4 ]

4 голосов
/ 11 октября 2011

Существует пакет, очевидно созданный Скотом Мартином здесь .

Насколько я вижу, он реализует множество функций 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}
*)

HTH!

1 голос
/ 18 апреля 2012

Я создал h5dumpImport, открытый исходный код Mathematica Пакет, который обеспечивает независимый от платформы способ импорта наборов данных файла HDF5 (.h5) с составными типами данных, скрывая при этом большую часть реализации HDF5 от пользователя.Пакет с документацией, примерами и модульным тестом находится здесь .

В настоящее время пакет h5dumpImport напрямую не импортирует формат файла HDF5 (.h5).Пакет h5dumpImport импортирует дамп ASCII набора данных, созданный инструментом командной строки h5dump.

Исходный код и предварительно созданные двоичные дистрибутивы программного обеспечения HDF5, которое включает в себя инструмент командной строки h5dump, можетможно найти на веб-сайте The HDF Group .

Базовый пример

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"}}

Подробные инструкции по установке,информацию об использовании и документацию, примеры и модульные тесты можно найти здесь .

1 голос
/ 11 января 2011

Появляется , что версия 8 по-прежнему игнорирует составные типы данных.Однако, начиная с версии 8, альтернативой может быть создание Import Converter , который может загружаться в составные типы данных.Это может означать, что вам придется заново внедрять импортер HDF5, но я не пробовал.Я все еще использую 7, но давно хотел такой тип функциональности.

0 голосов
/ 21 февраля 2019

Начиная с версии 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"|>
    |>
  |>
|>
...