有没有办法在 h5py 中一次获取所有组中的数据集?
Is there a way to get datasets in all groups at once in h5py?
我将数据存储在 .h5 中。我使用以下代码来显示组名,并调用其中一个组 (Event_[0]) 来查看其中的内容:
with h5py.File(data_path, 'r') as f:
ls = list(f.keys())
print('List of datasets: \n', ls)
data = f.get('group_1')
dataset1 = np.array(data)
print('Shape of dataset1: \n', dataset1.shape)
f.close()
它工作正常,但我有大约 2000 个组,每个组有一个数据集。如何避免为每个组编写相同的代码?有没有办法得到('all groups')?
编辑:再举一个例子:我使用
f['Event_[0]'][()]
看一组。这也可以应用于多个组吗?
只需迭代键列表:
with h5py.File(data_path, 'r') as f:
alist = []
ls = list(f.keys())
print('List of datasets: \n', ls)
for key in ls:
group = f.get(key)
dataset = group.get(datasetname)[:]
print('Shape of dataset: \n', dataset.shape)
alist.append(dataset)
# don't need f.close() in a with
没有allgroups
;有 iter 和 visit 方法,但它们最终做同样的事情 - 对于文件中的每个组,获取所需的数据集。 h5py
文档应该是完整的,没有隐藏的方法。 visit
是递归的,类似于 Python OS 访问目录和文件的功能。
在 h5py
中,文件和组的行为类似于 Python dicts
。它是行为类似于 numpy
数组的数据集。
如果您知道您将始终拥有此数据模式,则可以使用键(如上一个答案所示)。这意味着只有根级别的组,而数据集是每个组下的唯一对象。当您不知道文件的确切内容时,“访问者”功能非常方便。
有2个访客函数。它们是 visit()
和 visititems()
。每个递归地遍历对象树,为每个对象调用访问者函数。唯一的区别是 visit
的可调用函数接收 1 个值:name
,而 visititems
的可调用函数接收 2 个值:name
和 node
(一个 h5py 对象).名称就是一个对象的名称,而不是完整的路径名。我更喜欢 visititems
有两个原因:1) 拥有节点对象允许您对对象类型进行测试(如下所示),以及 2) 确定路径名需要您知道路径或使用对象的名称属性得到它。
下面的示例创建一个简单的 HDF5 文件,创建一些组和数据集,然后关闭文件。然后它以读取模式重新打开并使用 visititems()
遍历文件对象树。 (注意:访问者函数可以有任何名称,可以与任何对象一起使用。它从文件结构中的那个点开始递归遍历。)
此外,当您使用 with / as:
构造时,您不需要 f.close()
。
import h5py
import numpy as np
def visit_func(name, node) :
print ('Full object pathname is:', node.name)
if isinstance(node, h5py.Group) :
print ('Object:', name, 'is a Group\n')
elif isinstance(node, h5py.Dataset) :
print ('Object:', name, 'is a Dataset\n')
else :
print ('Object:', name, 'is an unknown type\n')
arr = np.arange(100).reshape(10,10)
with h5py.File('SO_63315196.h5', 'w') as h5w:
for cnt in range(3):
grp = h5w.create_group('group_'+str(cnt))
grp.create_dataset('data_'+str(cnt),data=arr)
with h5py.File('SO_63315196.h5', 'r') as h5r:
h5r.visititems(visit_func)
我将数据存储在 .h5 中。我使用以下代码来显示组名,并调用其中一个组 (Event_[0]) 来查看其中的内容:
with h5py.File(data_path, 'r') as f:
ls = list(f.keys())
print('List of datasets: \n', ls)
data = f.get('group_1')
dataset1 = np.array(data)
print('Shape of dataset1: \n', dataset1.shape)
f.close()
它工作正常,但我有大约 2000 个组,每个组有一个数据集。如何避免为每个组编写相同的代码?有没有办法得到('all groups')?
编辑:再举一个例子:我使用
f['Event_[0]'][()]
看一组。这也可以应用于多个组吗?
只需迭代键列表:
with h5py.File(data_path, 'r') as f:
alist = []
ls = list(f.keys())
print('List of datasets: \n', ls)
for key in ls:
group = f.get(key)
dataset = group.get(datasetname)[:]
print('Shape of dataset: \n', dataset.shape)
alist.append(dataset)
# don't need f.close() in a with
没有allgroups
;有 iter 和 visit 方法,但它们最终做同样的事情 - 对于文件中的每个组,获取所需的数据集。 h5py
文档应该是完整的,没有隐藏的方法。 visit
是递归的,类似于 Python OS 访问目录和文件的功能。
在 h5py
中,文件和组的行为类似于 Python dicts
。它是行为类似于 numpy
数组的数据集。
如果您知道您将始终拥有此数据模式,则可以使用键(如上一个答案所示)。这意味着只有根级别的组,而数据集是每个组下的唯一对象。当您不知道文件的确切内容时,“访问者”功能非常方便。
有2个访客函数。它们是 visit()
和 visititems()
。每个递归地遍历对象树,为每个对象调用访问者函数。唯一的区别是 visit
的可调用函数接收 1 个值:name
,而 visititems
的可调用函数接收 2 个值:name
和 node
(一个 h5py 对象).名称就是一个对象的名称,而不是完整的路径名。我更喜欢 visititems
有两个原因:1) 拥有节点对象允许您对对象类型进行测试(如下所示),以及 2) 确定路径名需要您知道路径或使用对象的名称属性得到它。
下面的示例创建一个简单的 HDF5 文件,创建一些组和数据集,然后关闭文件。然后它以读取模式重新打开并使用 visititems()
遍历文件对象树。 (注意:访问者函数可以有任何名称,可以与任何对象一起使用。它从文件结构中的那个点开始递归遍历。)
此外,当您使用 with / as:
构造时,您不需要 f.close()
。
import h5py
import numpy as np
def visit_func(name, node) :
print ('Full object pathname is:', node.name)
if isinstance(node, h5py.Group) :
print ('Object:', name, 'is a Group\n')
elif isinstance(node, h5py.Dataset) :
print ('Object:', name, 'is a Dataset\n')
else :
print ('Object:', name, 'is an unknown type\n')
arr = np.arange(100).reshape(10,10)
with h5py.File('SO_63315196.h5', 'w') as h5w:
for cnt in range(3):
grp = h5w.create_group('group_'+str(cnt))
grp.create_dataset('data_'+str(cnt),data=arr)
with h5py.File('SO_63315196.h5', 'r') as h5r:
h5r.visititems(visit_func)