[英]How to filter for specific objects in a HDF5 file
学习ILNumerics HDF5 API 。 我真的很喜欢使用C#对象初始化程序在一个表达式中设置复杂的HDF5文件的选项。 我创建了以下文件:
using (var f = new H5File("myFile.h5")) {
f.Add(new H5Group("myTopNode") {
new H5Dataset("dsNo1", ILMath.vec<float>(1,200)), // no attributes
new H5Group("myGroup") {
new H5Dataset("dsYes", ILMath.rand(100,200)) { // matching dataset
Attributes = {
{ "att1", 1 },
{ "att2", 2 }
}
},
new H5Dataset("dsNo2") { // attributes but wrong name
Attributes = {
{ "wrong1", -100 },
{ "wrong2", -200 }
}
}
}
});
}
现在,我正在寻找一种聪明的方法来遍历文件并筛选具有特定属性的数据集。 我想查找所有名称中至少具有一个带有“ att”的属性的数据集,并收集并返回其内容。 这是我到目前为止所做的:
IList<ILArray<double>> list = new List<ILArray<double>>();
using (var f = new H5File("myFile.h5")) {
var groups = f.Groups;
foreach (var g in groups) {
foreach (var obj in g) {
if (obj.H5Type == H5ObjectTypes.Dataset && obj.Name.Contains("ds")) {
var ds = obj as H5Dataset;
// look for attributes
foreach (var att in ds.Attributes) {
//ds.Attributes["att"].
if (att.Name.Contains("att")) {
list.Add(ds.Get<double>());
}
}
}
}
}
}
return list;
但这不是递归的。 我可以采用它,但是ILNumerics声称很方便,因此必须有更好的方法吗? 类似于python中的h5py吗?
H5Group
提供了Find<T>
方法,它H5Group
您的需求。 它遍历整个子树,并考虑任意谓词:
var matches = f.Find<H5Dataset>(
predicate: ds => ds.Attributes.Any(a => a.Name.Contains("att")));
为什么不让您的函数返回“ ILCell”而不是“ List”? 这可以更好地集成到ILNumerics内存管理中(不会有任何存储空间等待垃圾收集器通过):
using (var f = new H5File("myFile.h5")) {
// create container for the dataset contents
ILCell c = cell(size(1, 1)); // one element init
// retrieve datasets filtered
var matches = f.Find<H5Dataset>(predicate: ds => {
if (ds.Attributes.Any(a => a.Name.Contains("att"))) {
c[end + 1] = ds.Get<double>();
return true;
}
return false;
});
return c;
}
一些链接:
http://ilnumerics.net/hdf5-interface.html
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.