首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将多个hdf5文件合并成一个文件和数据集?

如何将多个hdf5文件合并成一个文件和数据集?
EN

Stack Overflow用户
提问于 2022-04-11 17:03:48
回答 2查看 975关注 0票数 1
代码语言:javascript
运行
复制
import h5py
import numpy as np

with h5py.File("myCardiac.hdf5", "w") as f:
    dset = f.create_dataset("mydataset", (100,), dtype = 'i')
    grp = f.create_group("G:/Brain Data/Brain_calgary/")

我尝试了这段代码来创建一个hdf5文件。一个文件夹中有50个hhdf5文件。我想将所有50个hdf5文件合并成一个hdf5文件集。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-04-11 18:50:21

若要将50个.h5文件合并为一个大型数据集,每个文件具有一个名为kspace的数据集和表单(24、170、218、256),请使用以下代码:

代码语言:javascript
运行
复制
import h5py
import os

with h5py.File("myCardiac.hdf5", "w") as f_dst:
    h5files = [f for f in os.listdir() if f.endswith(".h5")]

    dset = f_dst.create_dataset("mydataset", shape=(len(h5files), 24, 170, 218, 256), dtype='f4')

    for i, filename in enumerate(h5files):
        with h5py.File(filename) as f_src:
            dset[i] = f_src["kspace"]

详细描述

首先,您必须创建一个目标文件myCardiac.hdf5。然后获取目录中所有.h5文件的列表:

代码语言:javascript
运行
复制
h5files = [f for f in os.listdir() if f.endswith(".h5")]

注意:不带参数的 os.listdir()获取当前工作目录中的文件/foldes列表。我希望这个python脚本与文件位于同一个目录中,而CWD将被设置为这个目录。

下一步是在目标文件中创建具有所需大小和数据类型的数据集:

代码语言:javascript
运行
复制
dset = f_dst.create_dataset("mydataset", shape=(len(h5files), 24, 170, 218, 256), dtype='f4')

然后,可以迭代地将数据从源文件复制到目标数据集。

代码语言:javascript
运行
复制
for i, filename in enumerate(h5files):
    with h5py.File(filename) as f_src:
        dset[i] = f_src["kspace"]
票数 1
EN

Stack Overflow用户

发布于 2022-04-13 19:24:58

另一种方法是使用HDF5虚拟数据集在新文件中获取组合视图,而不重复数据。h5py参考资料。下面的示例是根据前面的答案改编的。见:将虚拟数据集读取到h5py数组中的NumPy错误。关于这一程序的说明:

  1. 代码文档中的注释记录了大部分步骤。
  2. 我使用glob.glob()来使用通配符获取源文件名的列表(假设源文件名为:myCardiac_01.hdf5, myCardiac_02.hdf5, myCardiac_03.hdf5, etc)。
  3. 访问第一个源文件以获取dtype和形状。所有源文件的值必须相同。
  4. 最后一步打印一些任意数据切片,以演示基于源shape=(24,170,218,256)的行为。酌情修改其他数据源。

源代码:

代码语言:javascript
运行
复制
import h5py
import glob

h5_files = glob.glob('myCardiac_0?.hdf5')

# Get parameters from source files to define virtual layout and dataset
a0 = len(h5_files)
with h5py.File(h5_files[0],'r') as h5f:
    h5_dtype = h5f['kspace'].dtype
    h5_shape = h5f['kspace'].shape
    print(h5_dtype,h5_shape)
    
# Assemble virtual dataset
vs_layout = h5py.VirtualLayout(shape=((a0,)+h5_shape), dtype=h5_dtype)
for n, h5file in enumerate(h5_files):
    vs_layout[n] = h5py.VirtualSource(h5file, 'kspace', shape=h5_shape)

# Add virtual dataset to output file
with h5py.File('myCardiac_VDS.h5', 'w') as f:
    f.create_virtual_dataset('kspace_vdata', vs_layout)

# print some data slices from the virtual dataset
with h5py.File('myCardiac_VDS.h5', 'r') as f:
    vds_ds = f['kspace_vdata']
    print(vds_ds.dtype,vds_ds.shape)
    for i in range(vds_ds.shape[0]):
        print(f'Slice from file {i}:\n{vds_ds[i,:,0,0,0]}')
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71831691

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档