【问题标题】:h5py open file with unknown datasetsh5py 打开带有未知数据集的文件
【发布时间】:2017-04-20 12:32:50
【问题描述】:

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

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

结果如下: KeysViewWithLock(<HDF5 file "example.hdf5" (mode r+)>)

我该怎么走?我想将矩阵作为单个 numpy.ndarray 访问。 h5py 文档总是谈论创建 hdf5 文件,而不是读取未知文件。 非常感谢。

解决方案(感谢 akash karothiya) 请改用print(list(f.keys()))。这给出了组/数据集的名称,然后可以作为a=f['dataset'] 访问。

【问题讨论】:

  • list(for.keys())
  • 谢谢,现在我可以知道数据集是如何命名的,并通过 a = f['dataset'] 获取一些数据。转换为 numpyarray 应该很容易,不需要帮助(我希望)。

标签: python hdf5


【解决方案1】:

好的,如前所述,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'])

【讨论】:

  • 如果你的数据集是一个 2xN 数组,你可以这样做 X, Y = f["dataset"].T Z = X + 1j*Y
  • 这是一个不错的解决方案。我实际上已经转到刚刚发布的版本,因为我不需要再考虑维度或实数/复数了。
猜你喜欢
  • 2015-07-03
  • 2019-04-26
  • 2017-06-12
  • 1970-01-01
  • 2014-12-24
  • 1970-01-01
  • 2017-10-05
  • 2017-12-06
  • 2018-10-12
相关资源
最近更新 更多