Как перезаписать массив внутри файла h5 с помощью h5py

Я пытаюсь перезаписать массив numpy, который является небольшой частью довольно сложного файла h5.

Я извлекаю массив, меняю некоторые значения, а затем хочу повторно вставить массив в файл h5.

У меня нет проблем с извлечением вложенного массива.

f1 = h5py.File(file_name,'r')
X1 = f1['meas/frame1/data'].value
f1.close()

Моя попытка кода выглядит примерно так, но безуспешно:

f1 = h5py.File(file_name,'r+')
dset = f1.create_dataset('meas/frame1/data', data=X1)
f1.close()

В качестве проверки работоспособности я выполнил это в Matlab, используя следующий код, и он работал без проблем.

h5write(file1, '/meas/frame1/data', X1);

Есть ли у кого-нибудь предложения о том, как это сделать успешно?


person user3508433    schedule 07.04.2014    source источник


Ответы (1)


Вы хотите присвоить значения, а не создать набор данных:

f1 = h5py.File(file_name, 'r+')     # open the file
data = f1['meas/frame1/data']       # load the data
data[...] = X1                      # assign new values to data
f1.close()                          # close the file

Чтобы убедиться, что изменения были правильно внесены и сохранены:

f1 = h5py.File(file_name, 'r')
np.allclose(f1['meas/frame1/data'].value, X1)
#True
person askewchan    schedule 07.04.2014
comment
Это data[...] = X1 очень важно! Не совершайте ошибку, делая data = X1. - person pattivacek; 14.01.2017
comment
Второй блок только для проверки, все ли закрыто, да? Таким образом, первые 4 строки выполняют фактическую работу. - person Dusch; 29.06.2017
comment
Еще одна ловушка заключается в том, что вам нужно перезаписать полную индивидуальную точку данных; поэтому, если ваши данные, например. 3D-точки, вы должны обновить полную 3D-точку. Изменения одного элемента точки данных (например, только координаты Z) ничего не изменят. - person Oliver Zendel; 20.09.2017
comment
@Dusch, вы правы, это просто проверка и первые четыре строки выполняют свою работу, но на самом деле она ничего не закрывает, а проверяет, совпадают ли значения. См. np.allclose. - person askewchan; 20.09.2017
comment
Нужно ли добавлять [...], если мы обновляем только часть набора данных? например если бы мы сделали data[5:] = X1, где len(data) = len(X1)+5 ? - person Bremsstrahlung; 01.05.2020