http://docs.h5py.org/en/stable/high/attr.html
They may be created from any scalar or NumPy array
data – Value of the attribute; will be put through numpy.array(data)
Создание массива из вашего кортежа:
In [115]: np.array((0, 'ld'))
Out[115]: array(['0', 'ld'], dtype='<U21')
In [116]: np.array((0, b'ld')) # for bytestring
Out[116]: array([b'0', b'ld'], dtype='|S21')
Получить атрибут как кортеж смешанного типа будет непросто.
Создание структурированногомассив (составной dtype) может работать:
In [122]: np.array((0, 'ld'), dtype='i,S10')
Out[122]: array((0, b'ld'), dtype=[('f0', '<i4'), ('f1', 'S10')])
In [123]: print(_)
(0, b'ld')
In [124]: __.tolist()
Out[124]: (0, b'ld')
Сохранение словаря в группу:
In [126]: dd = dict([('Rmin', (0, 'ld')), ('Rmax',(1, 'ld')), ('fracinc',(0.5, r'$\pi$'))])
In [131]: f = h5py.File('attrs.h5','w')
In [132]: g = f.create_group('group')
In [137]: for key in dd:
...: value = list(dd[key])
...: value[1] = value[1].encode('utf-8')
...: value = np.array(tuple(value), dtype='int,S10')
...: g.attrs[key] = value
...:
In [138]: g.attrs
Out[138]: <Attributes of HDF5 object at 140472104481960>
In [139]: list(g.attrs.items())
Out[139]: [('Rmin', (0, b'ld')), ('Rmax', (1, b'ld')), ('fracinc', (0, b'$\\pi$'))]
In [140]: g.attrs['fracinc']
Out[140]: (0, b'$\\pi$')
Отображается как кортеж, но на самом деле это просто numy void
.Нам нужно tolist()
или item()
, чтобы получить кортеж, который можно сравнить с другим кортежем:
In [142]: g.attrs['Rmin'].tolist()==(0,b'ld')
Out[142]: True
Для сравнения с dd['Rmin']
потребуется преобразовать одно строковое значение в / из строки байтов.
In [146]: def foo(value):
...: value = list(value)
...: value[1] = value[1].encode('utf-8')
...: return tuple(value)
...:
In [147]: dd1 = {key:foo(value) for key,value in dd.items()}
In [148]: dd1
Out[148]: {'Rmin': (0, b'ld'), 'Rmax': (1, b'ld'), 'fracinc': (0.5, b'$\\pi$')}
In [149]: g.attrs['Rmin'].tolist()==dd1['Rmin']
Out[149]: True
Это не соответствует dd1
, потому что я сохранил его с полем int
(у 'fracint' есть число с плавающей точкой):
In [155]: {key:value.item() for key,value in g.attrs.items()}
Out[155]: {'Rmin': (0, b'ld'), 'Rmax': (1, b'ld'), 'fracinc': (0, b'$\\pi$')}
Если я изменю foo
наint(value[0])
словари совпадают.
Так что если вам нужно выполнить такой тип сопоставления, вам нужно пройти тестовый пример через тот же тип обработки, который вы (и h5py
) выполняете для сохраненного значения.