Редактирование значений матрицы HDF5 - PullRequest
0 голосов
/ 01 июня 2018

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

У меня есть 3D-набор данных формы (101, 4, 2), который я извлекаю из файла HDF5.В этом примере я пытаюсь установить для каждого из значений значение с плавающей запятой 1,0.

file_name = r'C:\Labber\Data\2018\06\Data_0601\CSing.hdf5'
f = h5py.File(file_name, 'r+')
h5entry = f['/Data/Data']

for i in range(len(h5entry[:,0,0])):
    print(h5entry[i][0][1]) #prints 0.0
    h5entry[i][0][1] = 1.0 
    print(h5entry[i][0][1]) #still prints 0.0

Если я создаю пустой массив вместо ссылки на набор данных HDF5, я могу заставить это работать.

file_name = r'C:\Labber\Data\2018\06\Data_0601\CSing.hdf5'
f = h5py.File(file_name, 'r+')
entry = np.array(f['/Data/Data'])

for i in range(len(entry[:,0,0])):
    print(entry[i][0][1]) #prints 0.0
    entry[i][0][1] = 1.0 
    print(entry[i][0][1]) #prints 1.0

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

Кроме того, ранее я мог напрямую редактировать ключи HDF5, что еще больше сбивает меня с толку.Например, я успешно выполнил следующее до

file_name = r'C:\Labber\Data\2018\06\Data_0601\CSing.hdf5'
f = h5py.File(file_name, 'r+')
entry = f['Step list'][i]
entry['use_relations'] = relations
f['Step list'][i] = entry

И это работает.Любые идеи о том, что здесь происходит и как я могу сделать это наиболее эффективным способом?

1 Ответ

0 голосов
/ 02 июня 2018

Проблема заключается в многоэтапной индексации

h5entry[i][0][1] = 1.0

try

h5entry[i,0,1] = 1.0

h5entry[i][0][1] подходит для получения значений, но не работает для настройки, поскольку h5entry[i]копия набора данных, а не view.h5entry[i] - это массив, а не набор данных.


entry[i][0][1] = 1.0

работает, потому что entry уже является ndarray, а entry[i] является view, как и entry[i][0],С другой стороны, расширенное индексирование для массива не будет работать: entry[[1,2]][:,0][:,1]=3, потому что entry[[1,2]] является копией.

Из-за этих нюансов с представлением против копирования обычно безопаснее использовать одношаговое индексирование,будь то работа с h5py или ndarray:

entry[[0,1],0,1] = 3

Иногда полезно, если мы включаем неявное : при индексировании:

entry[i,:,:][0,:][1]

Код не нуждается в нем, но я делаю.Мне нужно напоминание о том, сколько измерений я работаю на каждом этапе.


f['Step list'][i] = entry

работает, потому что f['Step list'] - это набор данных, а не копия набора данных.

...