2014-09-10 2 views
4

Возможно ли разрезать набор данных h5py в двух подмножествах, не загружая их в память? Например .:h5py: набор данных для резки без загрузки в память

dset = h5py.File("/2tbhd/tst.h5py","r") 

X_train = dset['X'][:N/2] 
X_test = dset['X'][N/2:-1] 
+0

Что случилось с кодом, который вы опубликовали? –

+0

Код, который он отправил, мгновенно загрузит эти точки данных в память. Он хочет передать две ссылки на две половины своих данных, не проходя вокруг больших массивов. –

+0

Я не знаю, как это сделать. Сначала я думал, что ссылки на регион могут быть как-то то, что вам нужно, но, насколько я могу судить, это не ответ. –

ответ

3

No.

Вам нужно будет реализовать свой собственный класс, чтобы действовать в качестве вида на наборе данных. An old thread в списке рассылки h5py указывает на то, что такой класс DatasetView теоретически можно реализовать с использованием типов данных HDF5, но, вероятно, не стоит для многих случаев использования. Элементный доступ был бы очень медленным по сравнению с обычным массивом numpy (предполагая, что вы можете поместить свои данные в память).

Редактировать: Если вы хотите избежать беспорядка с пространством данных HDF5 (что бы это ни значило), вы можете согласиться на более простой подход. Попробуйте this gist Я только что написал. Используйте его следующим образом:

dset = h5py.File("/2tbhd/tst.h5py","r") 

from simpleview import SimpleView 
X_view = SimpleView(dset['X']) 

# Stores slices, but doesn't load into memory 
X_train = X_view[:N/2] 
X_test = X_view[N/2:-1] 

# These statements will load the data into memory. 
print numpy.sum(X_train) 
print numpy.array(X_test)[0] 

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

X_train_copy = numpy.array(X_train) 
Смежные вопросы