我是HDF5文件的新手,我不知道如何访问数据集中的块。我有一个相当大的数据集(1536,2048,11,18,2),它被分成(768,1024,1,1,1),每个块代表图像的一半。我想绘制数据集,给出每个(整个)图像的平均值(使用matplotlib)。
问:如何访问单独的块以及如何使用它们?h5py如何使用它们?)
下面是我的代码:
bla = np.random.randint(0,100, (1536, 2048, 11, 18, 2))
with h5py.File('test.h5','w') as f:
grp = f.create_group('Measurement 1')
grp.create_dataset('data', data = bla, chunks = (768,1024,1,1,1))
f.close()
字符串
我有这个来访问数据集,但我不知道如何访问块..
with h5py.File('test.h5', 'r') as hf:
for dset in hf['Measurement 1'].keys():
print (dset)
ds_hf = hf['Measurement 1']['data'] # returns HDF5 dataset object
print (ds_hf)
print (ds_hf.shape, ds_hf.dtype)
data_f = hf['Measurement 1']['data'][:] # adding [:] returns a numpy array
hf.close()
型
我需要程序打开每个块,获得平均值,并在打开下一个块之前再次关闭它,这样我的RAM就不会满了。
2条答案
按热度按时间vm0i2vca1#
下面是一个示例代码,你可以理解块在hdf5中是如何工作的,我以一种通用的方式开发了它,你可以根据你的需求修改它:
字符串
h7appiyu2#
块用于优化I/O性能。HDF 5(和h5 py)以分块的方式写/读数据(一次一个块)。这是在后台处理的,您不必担心分块机制。块大小/形状在创建数据集时定义,并且不能更改。如果您需要更改它,有HDF 5实用程序可以做到这一点。
在阅读数据时,你不必担心块大小(一般来说)。**更多细节见结尾处的评论。使用Numpy slice表示法读取所需的切片,h5 py/HDF 5将为您读取。您不必编写代码来一次读取一个块。
假设轴0是图像索引,下面的代码将读取每个图像数组到图像对象(作为numpy数组)。这比使用块对象要简单和干净得多。
字符串
虽然您不必担心读写数据的块大小,但为您的使用设置适当的大小很重要。这个讨论超出了你的问题。您的尺寸适合您的应用程序。