Чтение и декодирование строки hdf5 с помощью h5py - PullRequest
0 голосов
/ 29 апреля 2020

У меня есть файл hdf5, который содержит строчку, которую я буду sh читать в python (2), используя пакет h5py. Запись выглядит как h5dump:

DATASET "Name" {
   DATATYPE  H5T_STRING {
      STRSIZE 5;
      STRPAD H5T_STR_NULLTERM;
      CSET H5T_CSET_UTF8;
      CTYPE H5T_C_S1;
   }
   DATASPACE  SCALAR
   DATA {
   (0): "L_1_3"
   }
}

Я могу получить доступ к этому файлу и извлечь данные как

import h5py
fp = h5py.File("myfile.hdf5","r")
Data=fp.get("Name")

Печать содержимого Data приводит к <HDF5 dataset "Name": shape (), type "|S5">. Как извлечь строку?

Мой go - к решению использовать np.array(Data) для декодирования ее не удалось с сообщением IOError: Can't read data (no appropriate function for conversion path).

Ответы [ 2 ]

0 голосов
/ 29 апреля 2020

Я не знаком с синтаксисом HDF5 C ++. Похоже, набор данных «Имя» имеет поле с именем «L_1_3» со строкой. Существует более простой способ получить массив NumPy (и лучше при работе с большими наборами данных). Я думаю, что это поможет вам понять, как работать с HDF5 и h5py. Когда вы печатаете dtype, вы должны увидеть имя для каждого поля. Кроме того, я использую только Python3, извините, если есть какие-либо синтаксические ошибки ниже.

import h5py
fp = h5py.File("myfile.hdf5","r")
Data = fp["Name"]  ## same as fp.get("Name")

# To work with the h5py dataset object
print Data.dtype, Data.shape
print Data[0]["L_1_3"] ## to get the first row from dataset

# To work with a NumPy array
Data_arr = fp["Name"][:] ## Adding [:] returns a NumPy array.
print Data_arr.dtype, Data_arr.shape
print Data_arr[0][0] ## to get the first row from NumPy array
# This notation might be required, depends on array dtype:
print Data_arr[0]["L_1_3"] ## to get the first row from NumPy array

Приведенный выше код описывает базовые c шаги для чтения данных из набора данных HDF5 / h5py. Вот дополнительные соображения при работе с объектом набора данных h5py против массива NumPy. Отчасти это объясняется в моем ответе на аналогичный пост. Ссылка здесь: Ответ на 61464832

Легко спутать объекты набора данных h5py и NumPy массивы. По своей структуре они имеют похожее поведение, но они не одинаковы. Оба имеют форму и тип данных, поддерживают нарезку в стиле массива и могут использоваться с итератором. Вот ключевое отличие: если вы читаете набор данных в массив, вам нужно достаточно памяти для хранения всех данных. При доступе к объекту набора данных вы не читаете все данные в память . Это очень важно, когда вы получаете доступ к огромным наборам данных. В моем примере выше Data - это объект набора данных, а Data_arr - это массив NumPy с теми же данными. Использование памяти не имеет значения для вашего небольшого набора данных. Это имеет большое значение, если ваш набор данных большой, скажем (8000, 3, 1000, 2000) массив с плавающей точкой. Это почти 48 ГБ значений, что требует 384 ГБ памяти (если моя математика верна).

Вы можете выполнять множество операций типа «массив», не создавая массив. Единственный раз, когда вам действительно нужен массив, это то, что вам нужно использовать функцию NumPy, которая требует ввода массива.

Вот несколько примеров, которые показывают, как работать с набором данных Data, которые похожи на * Массив 1026 *.

import h5py
fp = h5py.File("myfile.hdf5","r")
# iterate on rows in dataset "Name"
# Note how an array does not need to created
# could also use 'Data' object from above: Data = fp["Name"]  
for row in fp["Name"] :
    print row
# Slice the first row from the dataset
firstrow_arr = fp["Name"][0]
# Slice the last column from the dataset
lastcol_arr = fp["Name"][:,-1]
0 голосов
/ 29 апреля 2020

Как насчет этого:

import h5py
fp = h5py.File("myfile.hdf5","r")
Data = fp.get("Name")

, а затем:

print Data[0] # ?

также вы можете попробовать проверить len(Data), чтобы проверить, есть ли у вас какие-либо данные.

...