Запись массива 2D Numpy в набор данных HDF5 - PullRequest
0 голосов
/ 18 апреля 2020

Итак, я хочу записать 2D Numpy Array в файл HDF5, используя Python (H5Py), однако я не могу заставить его работать правильно. Вот как должен выглядеть набор данных

Свойства

Данные

Вот код

    elements = {
        'Ti': ['47Ti', '49Ti'],
        'Cr': ['52Cr', '53Cr'],
        'Fe': ['54Fe', '57Fe'],
        'Mn': ['55Mn']}

    # arg3: signalData
    element_data = hdf5processor.process_signal_data(argv[3], elements)

    #hdf5processor.plot_elements(element_data)

    # arg4: outputFile
    hdf5processor.save_dataset(argv[4], elements, element_data)

    def save_dataset(filename, elements_list, element_data):
        hf = h5py.File(filename, 'a')

        elements_list_ascii = [n.encode("ascii", "ignore") for n in list(elements_list.keys())]

        elements_list_dataset = hf.create_dataset("spWork/ElementList", (len(elements_list_ascii), 1), data=elements_list_ascii, dtype=h5py.string_dtype())

        iostopes_used = np.array([['Element', 'Isotope(s)', 'Null', 'Null', 'Null'], ['Ti', '47Ti', '49Ti', 'Null', 'Null']])

        iostopes_used_dataset = hf.create_dataset("spWork/IsotopesUsed", (2, 5), data=iostopes_used, dtype=h5py.string_dtype())

        hf.close()

Я пытаюсь сохранить iostopes_used (2D Numpy String Array) в файл HDF5 в виде строки переменной длины, как на первом и втором изображениях.

1 Ответ

0 голосов
/ 18 апреля 2020

http://docs.h5py.org/en/stable/strings.html является соответствующей страницей h5py документов.

In [652]: iostopes_used = np.array([['Element', 'Isotope(s)', 'Null', 'Null', 'Null'], ['Ti', '47Ti', '
     ...: 49Ti', 'Null', 'Null']]) 
     ...:                                                                                              
In [653]: iostopes_used                                                                                
Out[653]: 
array([['Element', 'Isotope(s)', 'Null', 'Null', 'Null'],
       ['Ti', '47Ti', '49Ti', 'Null', 'Null']], dtype='<U10')
In [654]: f = h5py.File('names.h5','w')                                                                
In [655]: iostopes_used_dataset = f.create_dataset("data", data=iostopes_used)                         
---------------------------------------------------------------------------
....
TypeError: No conversion path for dtype: dtype('<U10')

Если вместо этого мы преобразуем строки Unicode Py3 в строки байтов Py2, сохранение выполняется:

In [656]: iostopes_used_dataset = f.create_dataset("data", data=iostopes_used.astype('S10'))           
In [657]: iostopes_used_dataset[:]                                                                     
Out[657]: 
array([[b'Element', b'Isotope(s)', b'Null', b'Null', b'Null'],
       [b'Ti', b'47Ti', b'49Ti', b'Null', b'Null']], dtype='|S10')
In [658]: f.close()  

===

Другой маршрут - строковые объекты переменной длины, как показано в этом недавнем вопросе SO: Не удалось записать в файл hdf5

In [663]: dt = h5py.special_dtype(vlen=str)
In [665]: f.create_dataset('other', iostopes_used.shape, dtype=dt)                                     
Out[665]: <HDF5 dataset "other": shape (2, 5), type "|O">
In [666]: _[:] = iostopes_used                                                                         
In [667]: _[:]                                                                                         
Out[667]: 
array([['Element', 'Isotope(s)', 'Null', 'Null', 'Null'],
       ['Ti', '47Ti', '49Ti', 'Null', 'Null']], dtype=object)
...