使用 h5py 沿新轴向现有 h5py 文件添加数据
Adding data to existing h5py file along new axis using h5py
我有一些生成 3d Numpy 数组的示例代码 -- 然后我使用 h5 文件将这些数据保存到 h5py 文件中。那么我如何 "append" 第 4 个维度的第二个数据集?或者,如何沿现有 .h5
文件的第 4 维(或新轴)编写另一个 3d 数据集?我已阅读我能找到的文档,none 个示例似乎解决了这个问题。我的代码如下所示:
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)
使用 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 'space' 并在其中放入 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)
我有一些生成 3d Numpy 数组的示例代码 -- 然后我使用 h5 文件将这些数据保存到 h5py 文件中。那么我如何 "append" 第 4 个维度的第二个数据集?或者,如何沿现有 .h5
文件的第 4 维(或新轴)编写另一个 3d 数据集?我已阅读我能找到的文档,none 个示例似乎解决了这个问题。我的代码如下所示:
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)
使用 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 'space' 并在其中放入 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)