遍历 HDF5 file/tree 并在 return 之后继续?
Traverse HDF5 file/tree and continue after return?
我有一个包含某种树结构的 HDF5 文件:
/a_1
/a_1/b_1
/a_1/b_1/data
/a_1
/a_1/b_2
/a_1/b_2/data
/a_2
/a_2/b_1
/a_2/b_1/data
/a_2
/a_2/b_2
/a_2/b_2/data
这里 /a_X/b_X
是组,可以假设数据集 data
包含某种数字数据。提取 data
的最佳方法是什么?当然,我会尝试:
def extract(name, node):
if isinstance(node, hdf.Dataset):
return node[...]
return None
with h5py.File(some_file) as f:
f.visititems(extract)
但在第一次返回 None
以外的内容后,这会停止。当然,可以构建一个全局对象并追加,但我想知道是否有某种 'best practice'?
适合您的整体脚本结构的任何内容。您可能会在 file/directory 步行代码中得到提示。
所以对于我的一个测试文件,一个简单的打印函数会产生:
def foo(name, obj):
print(name, obj)
return None
In [203]: f.visititems(foo)
Mcoo <HDF5 group "/Mcoo" (3 members)>
Mcoo/col <HDF5 dataset "col": shape (20,), type "<i4">
Mcoo/data <HDF5 dataset "data": shape (20,), type "<f8">
Mcoo/row <HDF5 dataset "row": shape (20,), type "<i4">
Mcsr <HDF5 group "/Mcsr" (3 members)>
Mcsr/data <HDF5 dataset "data": shape (20,), type "<f8">
Mcsr/indices <HDF5 dataset "indices": shape (20,), type "<i4">
Mcsr/indptr <HDF5 dataset "indptr": shape (11,), type "<i4">
我怀疑这是一种更常见的用法 - 只是一种快速探索数据结构的方法。要获取特定的 dataset
,我们通常会使用完全限定名称。或者迭代几级键。
In [207]: f['Mcoo/row']
Out[207]: <HDF5 dataset "row": shape (20,), type "<i4">
如您所见,并如文档所述,如果该函数尝试 return 找到的对象,它将退出。
def extract(name, node):
if isinstance(node, h5py.Dataset):
return node[...]
return None
In [211]: x=f.visititems(extract)
In [212]: x
Out[212]: array([0, 6, 8, 9, 4, 6, 9, 0, 1, 8, 9, 1, 2, 4, 6, 5, 6, 0, 4, 6])
我们可以在字典中收集项目(全局或属于某个对象):
def extract(name, node):
if isinstance(node, h5py.Dataset):
dd[name] = node[...]
return None
In [214]: dd = {}
In [215]: f.visititems(extract)
In [217]: list(dd.keys())
Out[217]:
['Mcoo/col',
'Mcsr/data',
...
'Mcoo/row']
但是文件本身可以作为字典访问,所以这可能不会增加太多,除了可能会压平嵌套。
或作为值列表,或名称和值的元组列表等
一个简单的class:
class MyClass():
def __init__(self):
self.sets = []
def __call__(self, name, node):
if isinstance(node, h5py.Dataset):
self.sets.append(node)
return None
In [227]: M = MyClass()
In [228]: f.visititems(M)
In [229]: M.sets
Out[229]:
[<HDF5 dataset "col": shape (20,), type "<i4">,
<HDF5 dataset "data": shape (20,), type "<f8">,
...
<HDF5 dataset "indptr": shape (11,), type "<i4">]
我有一个包含某种树结构的 HDF5 文件:
/a_1
/a_1/b_1
/a_1/b_1/data
/a_1
/a_1/b_2
/a_1/b_2/data
/a_2
/a_2/b_1
/a_2/b_1/data
/a_2
/a_2/b_2
/a_2/b_2/data
这里 /a_X/b_X
是组,可以假设数据集 data
包含某种数字数据。提取 data
的最佳方法是什么?当然,我会尝试:
def extract(name, node):
if isinstance(node, hdf.Dataset):
return node[...]
return None
with h5py.File(some_file) as f:
f.visititems(extract)
但在第一次返回 None
以外的内容后,这会停止。当然,可以构建一个全局对象并追加,但我想知道是否有某种 'best practice'?
适合您的整体脚本结构的任何内容。您可能会在 file/directory 步行代码中得到提示。
所以对于我的一个测试文件,一个简单的打印函数会产生:
def foo(name, obj):
print(name, obj)
return None
In [203]: f.visititems(foo)
Mcoo <HDF5 group "/Mcoo" (3 members)>
Mcoo/col <HDF5 dataset "col": shape (20,), type "<i4">
Mcoo/data <HDF5 dataset "data": shape (20,), type "<f8">
Mcoo/row <HDF5 dataset "row": shape (20,), type "<i4">
Mcsr <HDF5 group "/Mcsr" (3 members)>
Mcsr/data <HDF5 dataset "data": shape (20,), type "<f8">
Mcsr/indices <HDF5 dataset "indices": shape (20,), type "<i4">
Mcsr/indptr <HDF5 dataset "indptr": shape (11,), type "<i4">
我怀疑这是一种更常见的用法 - 只是一种快速探索数据结构的方法。要获取特定的 dataset
,我们通常会使用完全限定名称。或者迭代几级键。
In [207]: f['Mcoo/row']
Out[207]: <HDF5 dataset "row": shape (20,), type "<i4">
如您所见,并如文档所述,如果该函数尝试 return 找到的对象,它将退出。
def extract(name, node):
if isinstance(node, h5py.Dataset):
return node[...]
return None
In [211]: x=f.visititems(extract)
In [212]: x
Out[212]: array([0, 6, 8, 9, 4, 6, 9, 0, 1, 8, 9, 1, 2, 4, 6, 5, 6, 0, 4, 6])
我们可以在字典中收集项目(全局或属于某个对象):
def extract(name, node):
if isinstance(node, h5py.Dataset):
dd[name] = node[...]
return None
In [214]: dd = {}
In [215]: f.visititems(extract)
In [217]: list(dd.keys())
Out[217]:
['Mcoo/col',
'Mcsr/data',
...
'Mcoo/row']
但是文件本身可以作为字典访问,所以这可能不会增加太多,除了可能会压平嵌套。
或作为值列表,或名称和值的元组列表等
一个简单的class:
class MyClass():
def __init__(self):
self.sets = []
def __call__(self, name, node):
if isinstance(node, h5py.Dataset):
self.sets.append(node)
return None
In [227]: M = MyClass()
In [228]: f.visititems(M)
In [229]: M.sets
Out[229]:
[<HDF5 dataset "col": shape (20,), type "<i4">,
<HDF5 dataset "data": shape (20,), type "<f8">,
...
<HDF5 dataset "indptr": shape (11,), type "<i4">]