首页 文章

使用h5py沿新轴向现有h5py文件添加数据

提问于
浏览
2

我有一些生成3d Numpy数组的示例代码 - 然后我使用h5文件将此数据保存到h5py文件中 . 那么我怎么能沿着第四维度的第二个数据集"append"?或者,如何沿现有 .h5 文件的第4维(或新轴)编写另一个3d数据集?我已经阅读了我能找到的文档,但没有一个例子可以解决这个问题 . 我的代码如下所示:

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)

1 回答

  • 3

    使用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'空间'并在其中放入一个2d数组 - 至少不是这样 .

    但我可以添加维度(等级)到 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)
    

相关问题