2016-10-15 3 views
2

У меня есть пример кода, который генерирует массив 3d Numpy. Затем я сохраняю эти данные в файл h5py, используя h5-файл. Как я могу «добавить» второй набор данных по 4-му измерению? Или, как я могу написать еще один 3d-набор данных по 4-му измерению (или новой оси) существующего файла .h5? Я прочитал документацию, которую я смог найти, и ни один из примеров, похоже, не затрагивает это. Мой код показан ниже:Добавление данных в существующий файл h5py по новой оси с использованием h5py

import h5py 
import numpy as np 

dataset1 = np.random.rand(240,240,250); 
dataset2 = np.random.rand(240,240,250); 

with h5py.File('data.h5', 'w') as hf: 
    dset = hf.create_dataset('dataset_1', data=dataset1) 

ответ

2

Использование 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) 
Смежные вопросы