使用h5py打开具有未知数据集的文件

3

我尝试使用h5py打开由另一个程序创建的文件。不幸的是,我不知道文件的内部结构。我只知道它应该包含一个20x20的矩阵,我想用numpy处理它。 到目前为止,我所做的是:

import numpy
import h5py
f = h5py.File('example.hdf5')
print(f.keys())

结果如下: KeysViewWithLock(<HDF5文件"example.hdf5"(模式r+)>) 我该怎么办?我想将矩阵作为单个numpy.ndarray访问。 h5py文档总是谈论创建hdf5文件,而不是读取未知文件。非常感谢。
解决方案(感谢akash karothiya) 改用print(list(f.keys()))。 这会给出组/数据集的名称,然后可以像a=f['dataset']这样访问它们。

3
list(for.keys()) - undefined
谢谢,现在我知道数据集的名称并且可以通过 a = f['dataset'] 获取一些数据了。将其转换为 numpy 数组应该很容易,不需要帮助(希望如此)。 - undefined
1个回答

2

好的,如之前所述,akash karothiya帮助我找到了解决方案。不要使用print(f.keys()),而是使用print(list(f.keys()))。这将返回['dataset']。使用此信息,我可以获取一个h5py数据集对象,然后将其转换为numpy数组,如下所示:

a = f['dataset']
b = numpy.zeros(np.shape(a), dtype=complex)
for i in range(numpy.size(a,0)):
    b[i,:] = np.asarray(a[i]['real'] + 1j*a[i]['imag'], dtype=complex)

更新
新版本无需使用for循环,可能更快且非常通用(适用于复杂和实数数据以及尺寸为NxMxO的立方体):

a = f['dataset']
if len(a.dtype) == 0:       
    b = np.squeeze(a[()])          
elif len(a.dtype) == 2:       
    b = np.squeeze(a[()]['real'] + 1.0j*a[()]['imag'])

1
如果你的数据集是一个2xN的数组,你可以使用X, Y = f["dataset"].T来分别获取X和Y的值,然后通过Z = X + 1j*Y计算得到Z的值。 - undefined
这是一个很好的解决方案。实际上,我已经转向刚发布的版本,因为在那里我不再需要考虑维度或者实数/复数问题了。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接