首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用h5合并所有h5py文件

使用h5合并所有h5py文件
EN

Stack Overflow用户
提问于 2018-04-16 06:45:03
回答 1查看 4.6K关注 0票数 1

我是编码新手。有人可以帮助使用h5py编写一个脚本吗?在这个脚本中,我们可以读取所有目录和子目录,将多个h5文件合并到一个h5文件中。

EN

回答 1

Stack Overflow用户

发布于 2018-04-16 12:09:05

您需要的是文件中所有数据集的列表。我认为recursive function的概念是这里所需要的。这将允许您从一个组中提取所有的“数据集”,但是当其中一个数据集看起来是一个组本身时,递归地执行相同的操作,直到找到所有的数据集。例如:

代码语言:javascript
运行
复制
/
|- dataset1
|- group1
   |- dataset2
   |- dataset3
|- dataset4

您的函数在伪代码中应该如下所示:

代码语言:javascript
运行
复制
def getdatasets(key, file):

  out = []

  for name in file[key]:

    path = join(key, name)

    if file[path] is dataset: out += [path]
    else                      out += getdatasets(path, file)

  return out

就我们的例子而言:

  1. /dataset1是一个数据集:向输出添加路径,给出 out = '/dataset1‘1’
  2. /group不是数据集:调用getdatasets('/group',file)
代码语言:javascript
运行
复制
1. `/group/dataset2` is a dataset: add path to output, giving

nested_out = '/group/dataset2‘2’

2. /group/dataset3是一个数据集:向输出添加路径,给出

nested_out =‘/group/dataset2 2’,‘/group/dataset2 3’

这是在我们已经拥有的基础上增加的:

out =‘/dataset1 1’、‘/group/dataset1 2’、‘/group/dataset1 3’

  1. /dataset4是一个数据集:向输出添加路径,给出 out =‘/dataset3 1’、‘/group/dataset3 2’、‘/group/dataset3 3’、‘/dataset3 4’

此列表可用于将所有数据复制到另一个文件。

要做一个简单的克隆,您可以执行以下操作。

代码语言:javascript
运行
复制
import h5py
import numpy as np

# function to return a list of paths to each dataset
def getdatasets(key,archive):

  if key[-1] != '/': key += '/'

  out = []

  for name in archive[key]:

    path = key + name

    if isinstance(archive[path], h5py.Dataset):
      out += [path]
    else:
       out += getdatasets(path,archive)

  return out


# open HDF5-files
data     = h5py.File('old.hdf5','r')
new_data = h5py.File('new.hdf5','w')

# read as much datasets as possible from the old HDF5-file
datasets = getdatasets('/',data)

# get the group-names from the lists of datasets
groups = list(set([i[::-1].split('/',1)[1][::-1] for i in datasets]))
groups = [i for i in groups if len(i)>0]

# sort groups based on depth
idx    = np.argsort(np.array([len(i.split('/')) for i in groups]))
groups = [groups[i] for i in idx]

# create all groups that contain dataset that will be copied
for group in groups:
  new_data.create_group(group)

# copy datasets
for path in datasets:

  # - get group name
  group = path[::-1].split('/',1)[1][::-1]

  # - minimum group name
  if len(group) == 0: group = '/'

  # - copy data
  data.copy(path, new_data[group])

当然,进一步的自定义是可能的,这取决于您想要什么。你描述了一些文件的组合。在这种情况下,你必须

代码语言:javascript
运行
复制
 new_data = h5py.File('new.hdf5','a')

很可能给这条路增加了些东西。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49851046

复制
相关文章

相似问题

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