Я не очень внимательно изучил ваш код, когда писал свой комментарий.Я только что понял, что вы загружаете данные списка по одному элементу за раз.Есть намного лучшие / более быстрые способы сделать это с массивами Numpy.Я не знаю, с какими данными вы работаете, поэтому создал очень простой пример с несколькими числами с плавающей запятой в ampList
.Я использую np.asarray()
для преобразования списка в массив Numpy и загрузки в набор данных за 1 снимок.Гораздо проще и компактнее.Этот метод (с np.asarray()
) будет работать для любого списка с элементами общего типа (все числа с плавающей запятой или все целые).
Мой простой пример:
import h5py
import numpy as np
ampList = [ 20., 11., 33., 40., 100. ]
with h5py.File('SO_58092765.h5','w') as h5f:
h5f.create_dataset("amplitude", data=np.asarray(ampList) )
Лучший подход:
В приведенном выше примере рассматривается ваш основной вопрос (как скопировать данные списка в набор данных HDF).Тем не менее, я думаю, что есть лучший подход для вашего сценария.Я предполагаю, что у вас есть амплитуда, MffC и спектральные данные для каждого аудиофайла, и было бы удобно связать эти данные с именем аудиофайла.Если так, то именно здесь HDF5 и типы данных смешанного формата настолько мощны.
Я создал второй пример (ниже), чтобы показать, как можно сохранять смешанные данные в одном наборе данных.Я предположил следующие типы данных (чтобы сделать пример интересным):
- Имя аудиофайла: String
- амплитуда: Float
- MffC: Integer
- Спектральный (центроид): массив с плавающей точкой (3,)
В этом примере создаются 2 файла HDF5:
- SO_58092765_3ds.h5 : сохраняютсякаждый список в виде отдельного набора данных.
- SO_58092765_1ds.h5 : сохраняет все данные списка в одном наборе данных, причем каждый список записывается в отдельное поле / столбец.
Второй метод использует тип данных Numpy (dtype) для определения имени и типа данных каждого столбца данных в наборе данных HDF5.Затем dtype используется для создания пустого набора данных.Каждый список записывается в набор данных путем ссылки на имя поля.
Второй пример:
import h5py
import numpy as np
fileList = [ 'audio1.mp3', 'audio2.mp3', 'audio11.mp3', 'audio21.mp3','audio22.mp3' ]
ampList = [ 20., 11., 33., 40., 100. ]
mffcslist = [ 12, 8, 9, 14, 33 ]
centroidlist = [ (0.,0.,0.), (1.,0.,0.),
(0.,1.,0.), (0.,1.,0.),
(1.,1.,1.),]
# create SO_58092765_3ds.h5:
with h5py.File('SO_58092765_3ds.h5','w') as h5f:
h5f.create_dataset("amplitude", data=np.asarray(ampList) )
h5f.create_dataset("MffC", data=np.asarray(mffcslist) )
h5f.create_dataset("spectral", data=np.asarray(centroidlist) )
# create SO_58092765_1ds.h5 with ds_dtype:
ds_dtype = np.dtype( [("audiofile",'S20'), ("amplitude",float),
("MffC",int), ("spectral",float, (3,)) ] )
with h5py.File('SO_58092765_1ds.h5','w') as h5f:
ds = h5f.create_dataset("test_data", shape=(len(ampList),), dtype=ds_dtype )
ds['audiofile'] = np.asarray(fileList)
ds['amplitude'] = np.asarray(ampList)
ds['MffC'] = np.asarray(mffcslist)
ds['spectral'] = np.asarray(centroidlist)