Позвольте мне объяснить, что делает ваш код и почему вы получаете ошибки памяти. Сначала немного основ HDF5 / h5py. (Документы h5py являются отличной отправной точкой. Проверьте здесь: h5py QuickStart )
foo = f['foo']
и foo = f.get('foo')
оба возвращают объект набора данных h5py с именем 'foo'. (Примечание: это Чаще встречается это как foo = f['foo']
, но нет ничего плохого в методе get()
.) Объект набора данных отличается от с массивом NumPy. Наборы данных ведут себя как NumPy массивы; оба имеют форму и тип данных и поддерживают нарезку в стиле массива. Однако при доступе к объекту набора данных вы не читаете все данные в память. В результате им требуется меньше памяти для доступа. Это важно при работе с большими наборами данных!
Этот оператор возвращает массив Numpy: data_foo = f.get('foo').value
. Предпочтительный метод data_foo = f['foo'][:]
. (NumPy нотация срезов - это способ вернуть массив NumPy из объекта набора данных. Как вы обнаружили, .value
устарел.)
Это также возвращает массив Numpy: data_foo = foo[()]
(при условии foo определяется как указано выше).
Итак, когда вы вводите это уравнение data_foo = np.array(foo[()])
, вы создаете новый массив NumPy из другого массива (foo[()]
является входным объектом). Я подозреваю, что ваш процесс был уничтожен, потому что объем памяти для создания копии массива (8192, 3, 1080, 1920) превысил ваши системные ресурсы. Это утверждение будет работать для небольших наборов данных / массивов. Однако это не очень хорошая практика.
Вот пример, демонстрирующий использование различных методов (объект набора данных h5py против NumPy массива).
h5f = h5py.File('myfile.hdf5', mode='r')
# This returns a h5py object:
foo_ds = h5f['foo']
# You can slice to get elements like this:
foo_slice1 = foo_ds[0,:,:,:] # first row
foo_slice2 = foo_ds[-1,:,:,:] # last row
# This is the recommended method to get a Numpy array of the entire dataset:
foo_arr = h5f['foo'][:]
# or, referencing h5py dataset object above
foo_arr = foo_ds[:]
# you can also create an array with a slice
foo_slice1 = h5f['foo'][0,:,:,:]
# is the same as (from above):
foo_slice1 = foo_ds[0,:,:,:]