使用h5py处理复合数据类型:属性中的数据类型
我正在使用Silo和HDF5,但在用h5py访问一些元数据时遇到了问题。它输出了一些比较奇怪的HDF5结构,里面把一个DATATYPE
放在了另一个DATATYPE
里面。下面是从h5dump
得到的一部分输出:
DATATYPE "sigma_t" H5T_STD_I32LE;
ATTRIBUTE "silo" {
DATATYPE H5T_COMPOUND {
H5T_STRING {
STRSIZE 5;
STRPAD H5T_STR_NULLTERM;
CSET H5T_CSET_ASCII;
CTYPE H5T_C_S1;
} "meshid";
H5T_STRING {
STRSIZE 15;
STRPAD H5T_STR_NULLTERM;
CSET H5T_CSET_ASCII;
CTYPE H5T_C_S1;
} "value0";
H5T_STD_I32LE "ndims";
H5T_STD_I32LE "nvals";
H5T_STD_I32LE "nels";
H5T_IEEE_F32LE "time";
H5T_STD_I32LE "use_specmf";
H5T_STD_I32LE "centering";
H5T_ARRAY { [3] H5T_STD_I32LE } "dims";
H5T_ARRAY { [3] H5T_STD_I32LE } "zones";
H5T_ARRAY { [3] H5T_STD_I32LE } "min_index";
H5T_ARRAY { [3] H5T_STD_I32LE } "max_index";
H5T_ARRAY { [3] H5T_IEEE_F32LE } "align";
}
DATASPACE SCALAR
DATA {
(0): {
"mesh",
"/.silo/#000004",
2,
1,
100,
0,
-1000,
111,
[ 10, 10, 0 ],
[ 9, 9, 0 ],
[ 0, 0, 0 ],
[ 9, 9, 0 ],
[ 0.5, 0.5, 0 ]
}
}
}
ATTRIBUTE "silo_type" {
DATATYPE H5T_STD_I32LE
DATASPACE SCALAR
DATA {
(0): 501
}
}
简单来说,f['sigma_t'].attrs['silo']
返回了一个tuple
,里面有所有格式正确的数据,但没有任何与数据类型相关的标签。(我需要知道像meshid
、value0
这样的名字。)有没有办法获取这些信息?我现在很困惑。
示例文件和脚本
HDF5文件包含了“sigma_t”字段,实际数据存储在/.silo/#000004
里。
脚本:
import h5py
f = h5py.File('xsn.silo', 'r')
print f['sigma_t'].attrs['silo']
结果:
('mesh', '/.silo/#000004', 2, 1, 100, 0.0, -1000, 111, array([10, 10, 0], dtype=int32), array([9, 9, 0], dtype=int32), array([0, 0, 0], dtype=int32), array([9, 9, 0], dtype=int32), array([ 0.5, 0.5, 0. ], dtype=float32))
我还想要的是类似这样的东西:
('meshid','value0','ndims', ..., 'align')
这可能吗?
2 个回答
0
谢谢你的回答,Seth!你的回答对我有帮助,但我觉得这样可能会更简单一些。
#path of table that you want to look at
group = f[path]
#checking attributes leads to FIELD_0_NAME or TITLE
for attribute in group.attrs:
#I only one the ones that end with name
if attribute.endswith('NAME'):
#then I take the actual name (ex:TrialTime) instead of FIELD_0_NAME
print group.attrs[attribute]
3
我在
我最后做的事情是:
import h5py
f = h5py.File('xsn.silo', 'r')
group = f['sigma_t']
attr_id = h5py.h5a.open(group.id, 'silo')
data = dict(zip(attr_id.dtype.names, group.attrs['silo'],))