是否可以使用 python 3 对 h5py 中的键进行切片而不形成列表?

Posted

技术标签:

【中文标题】是否可以使用 python 3 对 h5py 中的键进行切片而不形成列表?【英文标题】:Is it possible to slice keys in h5py using python 3, without forming a list? 【发布时间】:2014-12-01 20:53:45 【问题描述】:

我正在使用 h5py 从 HDF5 文件中读取数据,并发现使用 Python 2 工作的代码在使用 Python 3 时无法工作。该文件被格式化,使得二维数据帧作为不同的数据集存在,这我想读入一个 3D 数组。文件结构如下:

file.h5
 |- groupname (group)
     |- frame1 (dataset)
     |- frame2 (dataset)
   ...

要将帧读入 3D 数组,我必须访问第一个数据集以获取其形状和类型信息。因为我实际上并不知道每一帧的确切名称,所以我用来访问第一帧的代码如下所示:

import h5py

fid = h5py.File('file.h5', 'r')
datagroup = fid['groupname']
dataset0 = datagroup[datagroup.keys()[0]]

但是,h5py 的 documentation 表示

“在 Python 3 中使用 h5py 时,keys()、values() 和 items() 方法将返回类似视图的对象而不是列表。”

视图对象支持迭代但不支持切片。因此,为了避免错误,我不得不将该行更改为以下内容:

dataset0 = datagroup[ [k for k in datagroup.keys()][0] ]

它人为地构造一个临时列表,然后抓取它的第一个元素。对我来说,这看起来很糟糕。有没有更好的方法来做到这一点?

【问题讨论】:

稍微好一点:datagroup[list(datagroup.keys())][0]] 【参考方案1】:

Group 支持返回一个迭代器,但不能直接迭代。这导致以下结果:

dataset0 = datagroup[next(iter(datagroup))]

【讨论】:

内部实现肯定有一些不同,因为如果我这样做,我会得到TypeError: 'KeyView' object is not an iterator ...这很奇怪,因为文档明确指出类似视图的对象“支持迭代”。唔。还有其他想法吗? 尝试省略 keys() 方法调用,因为迭代 Group 应该产生名称。 我刚刚关闭了当天的相关计算机,但明天我会试一试,谢谢。 不,没有骰子 - next(datagroup) 导致另一个 TypeError: 'Group' object is not an iterator。啊。 好的,然后试试next(iter(datagroup))

以上是关于是否可以使用 python 3 对 h5py 中的键进行切片而不形成列表?的主要内容,如果未能解决你的问题,请参考以下文章

在 python3 中使用 h5py 发现密钥

h5py 可以从内存中的字节数组加载文件吗?

使用 h5py 对 hdf5 进行增量写入

使用 h5py py2 制作的 hdf5 在 py3 中使用 h5py 打开后损坏

使用 cx_freeze 4.3.1 冻结 h5py 2.4 时出错

python开源库——h5py快速指南