【发布时间】:2020-11-03 17:00:59
【问题描述】:
我知道如何通过 Python 从附件 (URL) 中调用任何数据,除了与名称“ROI”相关的任何数据。例如,您可以检查“data_dic_save/displacements/roi_ref_formatted”。我想在我的工作中使用来自这条路径的数据(如掩码和区域)。但是,我无法打开(阅读)它们。你能帮帮我吗?
.mat 文件的 URL: https://www.dropbox.com/s/127vo3uew0fppw5/res.mat?dl=0
代码:
with h5py.File('~/res.mat', 'r') as f:
d = f.get('data_dic_save/displacements/roi_ref_formatted')
print(d.attrs['mask'])
错误信息:
KeyError: "Can't open attribute (can't locate attribute: 'mask')"
【问题讨论】:
-
这是一个有效的问题。您的数据集 (
data_dic_save/displacements/roi_ref_formatted) 没有名为mask的属性。这就是你得到错误的原因。可以通过print (d.attrs.__contains__('mask'))确认,其实这个数据集没有任何属性。 -
亲爱的kcw78,感谢您的回复。但是,如何从“roi_ref_formatted”读取数据?我在 Matlab 中检查了这个文件,并从这个路径中得到了很多信息。但我需要用 Python 解析这个文件...
-
您的数据集 (
roi_ref_formatted) 是形状为 (54,1) 的对象引用数组。使用print (d.dtype, d.shape)进行确认。保存为 HDF5 的 MATLAB 很复杂。它使用指向文件中其他对象的对象引用。要查看它是如何工作的,print (f[ d[0,0] ])你会得到HDF5 dataset "Lj",它是指向f['/#refs#/Lj']的对象引用你可以通过比较print (f['/#refs#/Lj'][:])和print (f[ d[0,0] ][:])来看到这一点 -
我检查了您的建议并得到以下信息:object (54, 1)
[[3707764736 2 1 1 110 1]] [[3707764736 2 1 1 110 1]] 但是,Matlab 得到了另一个结果(截图见附件链接)。为什么我会得到这些奇怪的值??? dropbox.com/sh/1uli6oeq9yzrn1r/AAAUI0qnymY1qoNRfok9J_Yva?dl=0 -
警告:我不是 MATLAB 或对象引用方面的专家。我所知道的一切都是通过反复试验学到的。我无法回答你的“为什么”问题。 MATLAB 使用一种复杂的方法以 HDF5 格式存储数据(大量的对象引用)。我用 HDFVIEW 打开了你的 .mat 文件。
displacements组中的所有数据集都是 54X1 对象引用数组。strains组中的所有数据集也是如此。我怀疑dispinfo和straininfo组中的数据集提供了映射。我在#refs#数据集中找到了region和size_mask数据。