Python HDF5 расширяет массив

#python #hdf5 #h5py

Вопрос:

Я пытаюсь расширить размеры набора данных <HDF5 «time_data»: форма (2048000, 63), введите «<f4″><f4»> в форму (2048000, 64) . В последнюю колонку я хотел бы добавить информацию из «<набора данных HDF5 «time_data»: форма (2048000, 1), введите «<f4″>». Но я совершенно не представляю, как это сделать.

До сих пор я пытался:

 mic['time_data'].resize(64, axis = 0)
 

Но он возвращает мне набор данных <HDF5 «time_data»: форма (64, 63), тип «<f4»>

Я очень новичок в файлах HDF5, поэтому, пожалуйста, скажите мне, если вам нужно больше информации, чем я вам дал!

Ответ №1:

После повторного прочтения вашего поста я понял, что размер вашего набора данных можно изменять (в противном случае h5py выдал бы ошибку при изменении размера). Вы можете подтвердить это, сравнив .shape атрибут с .maxshape атрибутом. Примечание: None означает отсутствие ограничений по размеру на этой оси.

[Для дальнейшего использования, если вам нужен набор данных с возможностью изменения размера, включите этот maxshape=() параметр при его создании. Для этого конкретного набора данных используйте maxshape=(2048000, None) , если вы хотите изменить размер только оси 1.]

Ваш неожиданный результат был вызван небольшой ошибкой в объявлении размера. Чтобы перейти от формы (2048000, 63) к форме (2048000, 64), это должно быть: mic['time_data'].resize(64, axis=1) или mic['time_data'].resize((2048000, 64))

Обновленный ответ
Вот развернутый ответ, в котором показано, как добавить данные из 'assembledH5Trigger.h5' в 'assembledH5TEST.h5' . Для справки, он печатает параметры .shape и .maxshape , прежде чем копировать данные из триггера в файлы микрофона.

 with h5py.File('assembledH5TEST.h5', 'r ') as mic, 
     h5py.File('assembledH5Trigger.h5', 'r') as trigger:

    print(f"mic['time_data'] shape={mic['time_data'].shape}; "   
          f" maxshape={mic['time_data'].maxshape}")          
    print(f"trigger['time_data'] shape={trigger['time_data'].shape}; "   
          f"maxshape={trigger['time_data'].maxshape}")          
    mic['time_data'].resize((2048000, 64))
    mic['time_data'][:,63] = trigger['time_data'][:,0]
 

Комментарии:

1. Спасибо за ваш ответ! Теперь я решил эту проблему. Я не создавал данные сам, поэтому я не знаю, как именно они были созданы

2. Да, при повторном чтении я понял, что ваш набор данных можно изменить. В противном случае вы получили бы ошибку. Я добавил некоторый код в свой ответ, чтобы показать, как получить атрибуты И как считывать данные из 1 файла и добавлять в набор данных в другом файле. Этот метод более эффективен с точки зрения памяти (важно для больших наборов данных).

Ответ №2:

В случае, если у кого-то еще возникнет эта проблема в будущем. Вот как я решил эту проблему (возможно, не очень хорошее решение, но оно работает):

     mic = h5py.File('assembledH5TEST.h5', "r ")
    trigger = h5py.File('assembledH5Trigger.h5', "r")


    arr = np.ones((2048000, 64))

    arr[:, 0:63] = mic["time_data"][:]
    arr[:,63] = trigger['time_data'][:,0]
    # Code to write arr to hdf5 file

 

Комментарии:

1. Ваш метод сработает, но одно предупреждение. Вы копируете данные из обоих файлов в промежуточный массив. Это может быть проблемой с очень большими наборами данных. (Промежуточные данные находятся в памяти.) HDF5 имеет преимущества по сравнению с «большими данными». Он предназначен для считывания «фрагментов» данных с диска в оперативную память, поэтому вы можете работать с наборами данных, размер которых превышает объем оперативной памяти.