Могу ли я удалить элемент из набора данных HDF5? - PullRequest
0 голосов
/ 08 мая 2018

Я хотел бы удалить элемент из набора данных HDF5 в Python. Ниже у меня есть пример кода

DeleteHDF5Dataset.py

# This code works, which deletes an HDF5 dataset from an HDF5 file

file_name = os.path.join('myfilepath', 'myfilename.hdf5')
f = h5py.File(file_name, 'r+')
f.__delitem__('Log list')

Однако я не хочу этого делать. 'mydatatset' - это набор данных HDF5, который имеет несколько элементов, и я хотел бы удалить один или несколько элементов по отдельности, например

DeleteHDF5DatasetElement.py

# This code does not work, but I would like to achieve what it's trying to do

file_name = os.path.join('myfilepath', 'myfilename.hdf5')
f = h5py.File(file_name, 'r+')

print(f['Log list'][3]) # prints the correct dataset element

f.__delitem__('Log list')[3]  # I want to delete element 3 of this HDF5 dataset

Лучшее решение, которое я могу придумать, - это создать временный набор данных, пройтись по исходному набору данных и добавить только те записи, которые я хочу сохранить, во временный набор данных, а затем заменить старый набор данных новым. Но это кажется довольно неуклюжим. У кого-нибудь есть чистое решение для этого? Кажется, должен быть простой способ просто удалить элемент.

Спасибо, и извините, если какая-либо из моих терминов неверна.

1 Ответ

0 голосов
/ 08 мая 2018

Похоже, у вас есть массив строк. Это не рекомендуемый способ хранения строк в HDF5, но давайте предположим, что у вас нет выбора, как хранить данные.

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

После всего этого, если вы все еще хотите удалить данные в указанном вами формате, вы можете просто извлечь массив, удалить элемент и переназначить его на набор данных:

arr = f['Log list'][:]  # extract to numpy array
res = np.delete(arr, 1)  # delete element with index 1, i.e. second element
f.__delitem__('Log list')  # delete existing dataset
f['Log list'] = res  # reassign to dataset
...