Составные типы данных с h5py: тип данных внутри атрибута

Я использую Silo с HDF5, и у меня возникают проблемы с доступом к некоторым метаданные с помощью h5py. Он выдает довольно необычную структуру HDF5, где он помещает DATATYPE внутри DATATYPE. Вот выдержка из вывода h5dump:

DATATYPE "sigma_t" H5T_STD_I32LE;
   ATTRIBUTE "silo" {
      DATATYPE  H5T_COMPOUND {
         H5T_STRING {
            STRSIZE 5;
            STRPAD H5T_STR_NULLTERM;
            CSET H5T_CSET_ASCII;
            CTYPE H5T_C_S1;
         } "meshid";
         H5T_STRING {
            STRSIZE 15;
            STRPAD H5T_STR_NULLTERM;
            CSET H5T_CSET_ASCII;
            CTYPE H5T_C_S1;
         } "value0";
         H5T_STD_I32LE "ndims";
         H5T_STD_I32LE "nvals";
         H5T_STD_I32LE "nels";
         H5T_IEEE_F32LE "time";
         H5T_STD_I32LE "use_specmf";
         H5T_STD_I32LE "centering";
         H5T_ARRAY { [3] H5T_STD_I32LE } "dims";
         H5T_ARRAY { [3] H5T_STD_I32LE } "zones";
         H5T_ARRAY { [3] H5T_STD_I32LE } "min_index";
         H5T_ARRAY { [3] H5T_STD_I32LE } "max_index";
         H5T_ARRAY { [3] H5T_IEEE_F32LE } "align";
      }
      DATASPACE  SCALAR
      DATA {
      (0): {
            "mesh",
            "/.silo/#000004",
            2,
            1,
            100,
            0,
            -1000,
            111,
            [ 10, 10, 0 ],
            [ 9, 9, 0 ],
            [ 0, 0, 0 ],
            [ 9, 9, 0 ],
            [ 0.5, 0.5, 0 ]
         }
      }
   }
   ATTRIBUTE "silo_type" {
      DATATYPE  H5T_STD_I32LE
      DATASPACE  SCALAR
      DATA {
      (0): 501
      }
   }

По сути, f['sigma_t'].attrs['silo'] возвращает tuple со всеми правильно отформатированными данными, но без каких-либо связанных меток для типов данных. (Мне нужно знать имена meshid, value0 и т. д.) Есть ли способ получить это? Я в растерянности.

Пример файла и скрипт

файл HDF5 содержит поле "sigma_t", а фактические данные хранятся в /.silo/#000004.

Скрипт:

import h5py
f = h5py.File('xsn.silo', 'r')
print f['sigma_t'].attrs['silo']

Результат:

('mesh', '/.silo/#000004', 2, 1, 100, 0.0, -1000, 111, array([10, 10,  0], dtype=int32), array([9, 9, 0], dtype=int32), array([0, 0, 0], dtype=int32), array([9, 9, 0], dtype=int32), array([ 0.5,  0.5,  0. ], dtype=float32))

Я также хочу что-то вроде:

('meshid','value0','ndims', ..., 'align')

Это возможно?


person Seth Johnson    schedule 11.05.2011    source источник
comment
В любом случае вы можете указать на пример файла?   -  person diliop    schedule 12.05.2011
comment
На первый взгляд кажется, что составной dtype плохо переводится в h5py, и метки действительно теряются. Однако порядок сохраняется, поэтому вы определенно можете определить словарь с индексами для кортежа и получить к ним доступ по имени. Также стоит изучить h5py.h5t, так как это модуль для обработки таких dtypes.   -  person diliop    schedule 12.05.2011
comment
@diliop Это ошибка в h5py, смотрите мой ответ и ссылку на страницу группы Google.   -  person Seth Johnson    schedule 12.05.2011


Ответы (2)


Я получил ответ от разработчика через страницу групп Google h5py: ошибка, которая будет исправлена ​​в h5py 1.4.

В итоге я сделал следующее:

import h5py
f = h5py.File('xsn.silo', 'r')
group = f['sigma_t']
attr_id = h5py.h5a.open(group.id, 'silo')
data = dict(zip(attr_id.dtype.names, group.attrs['silo'],))
person Seth Johnson    schedule 12.05.2011

Спасибо за ответ Сет! Ваш ответ помог мне, но это может сделать его немного проще

    #path of table that you want to look at              
    group = f[path]                    
         #checking attributes leads to FIELD_0_NAME or TITLE
         for attribute in group.attrs:
            #I only one the ones that end with name
            if attribute.endswith('NAME'):
                #then I take the actual name (ex:TrialTime) instead of FIELD_0_NAME
                print group.attrs[attribute]
person J Klein    schedule 04.11.2014