h5py - изменить набор данных, например numpy.reshape()

Я хочу изменить форму моего набора данных h5py, как я могу сделать с помощью numpy.reshape(). Следующий код работает, только если я использую numpy.array() в начале кода. Но это работает только с небольшим набором данных и взрывает мою память, если я возьму больший.

import h5py
import numpy as np

#load data
h5py_data_path = 'any\path\to\h5pyData\training.data.h5'
t_data = h5py.File(h5py_data_path,'r')
training_data = t_data['training.data']
######################################
#### Don't want to have this (blows up my memory) ####
training_data = np.array(training_data)
######################################

print('training_data    ',training_data.shape)
#out: training_data     (10203, 5, 341)

#reshape data
######################################
#### That works, but only with upper Numpy Code ####
training_data = training_data.reshape(training_data.shape[0], 1, 5, 341)
######################################

print('training_data    ',training_data.shape)
#out: training_data     (10203, 1, 5, 341)

Есть ли в h5py какой-либо собственный способ изменить это любым другим рабочим способом?


person H. Senkaya    schedule 17.05.2019    source источник
comment
Какую часть h5py документов вы не понимаете?   -  person hpaulj    schedule 17.05.2019
comment
training_data[0:n] загружает фрагмент набора данных в память.   -  person hpaulj    schedule 17.05.2019
comment
Файл HDF5 представляет собой структуру данных на диске. Таким образом, собственного метода .reshape() не существует. Однако есть метод .resize() для добавления к существующему набору данных. Когда вы получаете доступ к набору данных в виде массива numpy, вы получаете представление (в памяти) данных на диске. В вашем примере вы добавляете измерение в массив (от (10203, 5, 341) до (10203, 1, 5, 341)). Каковы ваши намерения? Если вам действительно нужно изменить данные для обучения, вы можете прочитать набор данных, изменить его форму и записать в новый набор данных. Новый набор данных может идти как в текущем файле, так и в новом.   -  person kcw78    schedule 17.05.2019
comment
training_data = t_data['training_data'].value.reshape(значения формы) работало, но все еще была проблема с памятью. Кажется, стоит подготовить данные к новой форме...   -  person H. Senkaya    schedule 17.05.2019
comment
Да, это большой массив для изменения формы. Примечание .value устарело в h5py. Рекомендуемый метод теперь похож на нарезку массива numpy: training_data = t_data['training_data'][:] (для доступа ко всему массиву). Он примет метод .reshape().   -  person kcw78    schedule 17.05.2019
comment
Кроме того, ознакомьтесь с этим SO Q&A: numpy-reshape-memory-error для очень похожего обсуждения. Это может быть полезно для вашей ситуации.   -  person kcw78    schedule 17.05.2019
comment
Ваш удаленный ответ предполагает, что загрузка набора данных с помощью np.array(dataset) использует больше памяти, чем dataset.value или dataset[:]. np.array(dataset) может загружаться так же, как value, а затем сделать его копию (а затем удалить исходную загрузку). np.asarray(dataset) было бы лучше, но все равно не нужно.   -  person hpaulj    schedule 18.05.2019


Ответы (1)


Несмотря на то, что это хорошая функция, документация H5py является явной: ранг набора данных (количество измерений) фиксируется при его создании.

person rocketman    schedule 30.12.2020