matplotlib HDF5文件和使用块打印

lqfhib0f  于 2023-08-06  发布在  其他
关注(0)|答案(2)|浏览(153)

我是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就不会满了。

vm0i2vca

vm0i2vca1#

下面是一个示例代码,你可以理解块在hdf5中是如何工作的,我以一种通用的方式开发了它,你可以根据你的需求修改它:

import h5py
import numpy as np

# Generate random data
bla = np.random.randint(0, 100, (1536, 2048, 11, 18, 2))

# Create the HDF5 file and dataset
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))

# Open the HDF5 file
with h5py.File('test.h5', 'r') as hf:
    # Access the dataset
    ds_hf = hf['Measurement 1']['data']
    print(ds_hf)
    print(ds_hf.shape, ds_hf.dtype)

    # Iterate over the chunks
    for chunk_idx in np.ndindex(ds_hf.chunks):
        chunk = ds_hf[chunk_idx]
        # Process the chunk
        chunk_mean = np.mean(chunk)
        print(f"Chunk {chunk_idx}: Mean value = {chunk_mean}")

# Close the HDF5 file
hf.close()

字符串

h7appiyu

h7appiyu2#

块用于优化I/O性能。HDF 5(和h5 py)以分块的方式写/读数据(一次一个块)。这是在后台处理的,您不必担心分块机制。块大小/形状在创建数据集时定义,并且不能更改。如果您需要更改它,有HDF 5实用程序可以做到这一点。
在阅读数据时,你不必担心块大小(一般来说)。**更多细节见结尾处的评论。使用Numpy slice表示法读取所需的切片,h5 py/HDF 5将为您读取。您不必编写代码来一次读取一个块。
假设轴0是图像索引,下面的代码将读取每个图像数组到图像对象(作为numpy数组)。这比使用块对象要简单和干净得多。

with h5py.File('test.h5', 'r') as hf:
    ds_hf = hf['Measurement 1']['data'] # returns HDF5 dataset objects
    print(ds_hf.shape)
    for i in range(len(ds_hf.shape[0]):
        image = ds_hf[i] # this returns numpy array for image i

字符串
虽然您不必担心读写数据的块大小,但为您的使用设置适当的大小很重要。这个讨论超出了你的问题。您的尺寸适合您的应用程序。

相关问题