Как сохранить список извлеченных функций в файле hdf5 python - PullRequest
0 голосов
/ 25 сентября 2019

Я извлекаю некоторые функции из аудиофайла и сохраняю их в виде списка, а затем сохраняю список в файле hdf5, но это вызывает ошибку.Ранее я напрямую сохранял функции в файле hdf5, но он просто перезаписывал все значения и сохранял только последнее.

ampList = []
 mffcslist = []
 centroidlist = []
 i = 0


    ampList.append(Xdb)        # saving extracted feature in a list
    mffcslist.append(mfccs)    
    centroidlist.append(spectral_centroids)

with h5py.File('C:/Users/Aweem Ashar/Desktop/feature.h5', 'a') as f:
    f.close()

    for i in range(len(audio_path)):
        #print(ampList[i])

        f.create_dataset("amplitude", data=ampList[i])
        f.create_dataset("MffC", data=mffcslist[i])
        f.create_dataset("spectral", data=centroidlist[i])

    # plt.show()      # To view Wave graph

1 Ответ

0 голосов
/ 25 сентября 2019

Я не очень внимательно изучил ваш код, когда писал свой комментарий.Я только что понял, что вы загружаете данные списка по одному элементу за раз.Есть намного лучшие / более быстрые способы сделать это с массивами 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)
...