【问题标题】:extracting data from HDF5 dataset从 HDF5 数据集中提取数据
【发布时间】:2020-06-21 14:24:24
【问题描述】:

我有一个使用 h5py 读取的 mat 文件,我需要提取数据 en np.arrays 或其他形式来分析它并绘制它。

in: data   = h5py.File('footprints/HuascoFP.mat','r')

FP     = data["FP"]
FP.keys() # ---> ['EC', 'LAS', 'MWS', 'OMS', 'datenumber', 'meteo']
OMS    = FP["OMS"]
OMS.keys() #----> ['fp1D', 'fp2D', 'posR', 'posT']
fp2d   = OMS["fp2D"]#----> ['FP', 'x', 'y']
FP     =fp2d["FP"]
print(FP)

out:<HDF5 dataset "FP": shape (475, 1), type "|O">'

如果我尝试“FP[:2]”,我得到:([[], []], dtype=object) 没有任何数据。

希望得到你们的帮助

【问题讨论】:

  • 您如何看待使用 pandas 读取 h5 文件和绘图?
  • 您是否通过使用“save -v7.3”选项保存 MAT 文件来获取 HDF5 格式来创建此文件?如果是这样,请准备好进行一些严肃的编码。 Matlab 使用“对象引用”来访问数据。如果您是 HDF5 和 h5py 的新手,这些都不容易使用(根据经验)。您必须解码 dtype=object 值才能找到它指向的对象。然后你读那个对象。 SO中有一些例子。 (我写了一篇展示如何读取 .MAT/HDF5 格式的 SVHN 数据集。)
  • 谢谢@kcw78,你有你提到的例子吗?事实上,谁给文件保存在“v7.3”中。我打印显示的输出实际上是: [] :(.

标签: python numpy hdf5 h5py


【解决方案1】:

我本来打算写评论的,但是太长了。 这是我的答案的链接:
SO_55566865:difference-between-two-ways-of-accessing-the-hdf5-group

很长。第一部分展示了如何取消引用 HDF5“对象引用”。 (剩下的答案是针对SVHN数据集的。)

我将尝试应用您的示例。 (我认为我做对了,但可能会出现错误,因为我无法使用您的数据进行测试。)
您的代码中的data 引用了一个文件对象。
FP = data["FP"] 引用了一个顶级组称为“FP”,依此类推。

连接所有组和数据集名称,您的对象引用在这里:(我更改了名称以避免与“FP”的第一个值冲突)
FP_arr = data["/FP/OMS/fp2D"]["FP"]

方法 1 在我的示例中显示了如何获取引用的对象。你从那里做什么取决于你找到的数据。

fp2d["FP"] or data["/FP/OMS/fp2D"]["FP"] 是一个对象引用数组。将对象引用与文件对象结合起来得到下一个对象。因此,使用您的命名:
obj_ref=fp2d["FP"][0][0] 是第一个对象引用。
data[ fp2d["FP"][0][0] ]data[obj_ref] 返回第一个对象。

您可以使用.name 属性打印此对象的路径。 对于上面的对象:
obj_ref_name = data[obj_ref].name
print( obj_ref_name )

您可以通过比较访问引用对象的 3 种方式来了解其工作原理。以下行指向同一个对象,并且应该产生相同的输出:
data[ fp2d["FP"][0][0] ]
data[obj_ref]
data[obj_ref_name]

然后您可以使用它继续询问数据。

旁注:对象引用很难。当我第一次盯着他们工作时,我用 HDFView 打开了 HDF5 文件以“查看”发生了什么。这样理解起来就容易多了。

【讨论】:

    猜你喜欢
    • 2014-06-11
    • 2011-04-18
    • 2021-04-28
    • 2021-03-23
    • 2018-07-13
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 2014-07-30
    相关资源
    最近更新 更多