Использование http://docs.h5py.org/en/latest/high/dataset.html Я экспериментировал немного:
In [504]: import h5py
In [505]: f=h5py.File('data.h5','w')
In [506]: data=np.ones((3,5))
Сделать обычный dataset
:
In [509]: dset=f.create_dataset('dset', data=data)
In [510]: dset.shape
Out[510]: (3, 5)
In [511]: dset.maxshape
Out[511]: (3, 5)
Помощь для resize
:
In [512]: dset.resize?
Signature: dset.resize(size, axis=None)
Docstring:
Resize the dataset, or the specified axis.
The dataset must be stored in chunked format; it can be resized up to
the "maximum shape" (keyword maxshape) specified at creation time.
The rank of the dataset cannot be changed.
Поскольку я не указал maxshape
, это не похоже, что я могу изменить или добавить к этому набору данных.
In [513]: dset1=f.create_dataset('dset1', data=data, maxshape=(2,10,10))
...
ValueError: "maxshape" must have same rank as dataset shape
Поэтому я не могу определить 3d-пространство и разместить в нем 2-мерный массив - по крайней мере, не так.
Но я могу добавить измерение (ранг) в data
:
In [514]: dset1=f.create_dataset('dset1', data=data[None,...], maxshape=(2,10,10))
In [515]: dset1
Out[515]: <HDF5 dataset "dset1": shape (1, 3, 5), type "<f8">
Теперь я могу изменить размер набора данных - в 1 или более размеров, вплоть до определенной макс.
In [517]: dset1.resize((2,3,10))
In [518]: dset1
Out[518]: <HDF5 dataset "dset1": shape (2, 3, 10), type "<f8">
In [519]: dset1[:]
Out[519]:
array([[[ 1., 1., 1., 1., 1., 0., 0., 0., 0., 0.],
[ 1., 1., 1., 1., 1., 0., 0., 0., 0., 0.],
[ 1., 1., 1., 1., 1., 0., 0., 0., 0., 0.]],
[[ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]]])
оригинальный data
занимает угол расширенного набора данных
Теперь заполнить несколько нулей:
In [521]: dset1[1,:,:]=10
In [523]: dset1[0,:,5:]=2
In [524]: dset1[:]
Out[524]:
array([[[ 1., 1., 1., 1., 1., 2., 2., 2., 2., 2.],
[ 1., 1., 1., 1., 1., 2., 2., 2., 2., 2.],
[ 1., 1., 1., 1., 1., 2., 2., 2., 2., 2.]],
[[ 10., 10., 10., 10., 10., 10., 10., 10., 10., 10.],
[ 10., 10., 10., 10., 10., 10., 10., 10., 10., 10.],
[ 10., 10., 10., 10., 10., 10., 10., 10., 10., 10.]]])
Так что да, вы можете положить оба ваших dataset
в одном h5
наборе данных, при условии, вы указали достаточно большое значение maxshape
, например (2,240,240,250) или (240,240,500) или (240,240,250,2) и т. Д.
Или для неограниченного изменения размера maxshape=(None, 240, 240, 250))
.
Похоже, что основное ограничение - вы не можете добавить измерение после создания.
Другой подход заключается в конкатенации данных перед хранением, например.
dataset12 = np.stack((dataset1, dataset2), axis=0)