是否可以使用 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 中的键进行切片而不形成列表?的主要内容,如果未能解决你的问题,请参考以下文章
使用 h5py py2 制作的 hdf5 在 py3 中使用 h5py 打开后损坏