Хранение списка строк в наборе данных HDF5 из Python
Я пытаюсь сохранить список строк переменной длины в набор данных HDF5. Для этого код
import h5py
h5File=h5py.File('xxx.h5','w')
strList=['asas','asas','asas']
h5File.create_dataset('xxx',(len(strList),1),'S10',strList)
h5File.flush()
h5File.Close()
Я получаю сообщение об ошибке " TypeError: нет пути преобразования для dtype: dtype ('< U3')"
где < означает фактическое меньше, чем символ
Как я могу решить эту проблему.
3 ответов
Вы читаете в строках Unicode, но указываете свой тип данных как ASCII. Согласно в h5py Вики, h5py в настоящее время не поддерживает это преобразование.
вам нужно будет кодировать строки в формате дескрипторов h5py:
asciiList = [n.encode("ascii", "ignore") for n in strList]
h5File.create_dataset('xxx', (len(asciiList),1),'S10', asciiList)
Примечание: не все, закодированное в UTF-8, может быть закодировано в ASCII!
в HDF5 данные в формате VL хранятся как векторы произвольной длины a базовый тип. В частности, строки хранятся в C-стиле в null-завершенной буферов. NumPy не имеет собственного механизма для поддержки этот. К сожалению, это фактический стандарт представительства строки в API HDF5 C и во многих приложениях HDF5.
к счастью, NumPy имеет общий тип указателя в виде "object "("O") dtype. В h5py строки переменной длины соответствовать массив объектов. Небольшое количество метаданных, присоединенных к dtype" O" сообщает h5py, что его содержимое должно быть преобразовано в строки VL, когда хранится в файле.
существующие строки VL можно читать и записывать без дополнительных усилие; строки Python и строки NumPy фиксированной длины могут быть автоматически преобразуется в данные VL и сохраняется.
пример
In [27]: dt = h5py.special_dtype(vlen=str)
In [28]: dset = h5File.create_dataset('vlen_str', (100,), dtype=dt)
In [29]: dset[0] = 'the change of water into water vapour'
In [30]: dset[0]
Out[30]: 'the change of water into water vapour'
Я в аналогичной ситуации хочу сохранить имена столбцов dataframe в качестве набора данных в файле hdf5. Предполагая ДФ.столбцы-это то, что я хочу сохранить, я нашел следующие работы:
h5File = h5py.File('my_file.h5','w')
h5File['col_names'] = df.columns.values.astype('S')
при этом предполагается, что имена столбцов являются простыми строками, которые могут быть закодированы в ASCII.