h5py: нарезка набора данных без загрузки в память

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

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

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

person memecs    schedule 10.09.2014    source источник
comment
Что не так с кодом, который вы разместили?   -  person John Zwinck    schedule 10.09.2014
comment
Код, который он разместил, мгновенно загрузит эти точки данных в память. Он хочет передать две ссылки на две половины своих данных, не передавая большие массивы.   -  person Stuart Berg    schedule 10.09.2014
comment
Я не знаю, как это сделать. Сначала я подумал, что ссылки на регионы могут быть тем, что вам нужно, но, насколько я могу судить, это не ответ.   -  person Stuart Berg    schedule 10.09.2014
comment
Теперь я вспоминаю эту старую ветку в списке рассылки h5py: groups.google.com/ d/msg/h5py/9WKEiIIBBR8/lbaXCZ7WQFYJ   -  person Stuart Berg    schedule 10.09.2014
comment
@JohnZwinck, как сказал superbatfish, этот код мгновенно загружает данные в память.   -  person memecs    schedule 10.09.2014


Ответы (1)


No.

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

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

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)
person Stuart Berg    schedule 10.09.2014