gpt4 book ai didi

c# - 如何过滤 HDF5 文件中的特定对象

转载 作者:太空宇宙 更新时间:2023-11-03 18:25:46 25 4
gpt4 key购买 nike

学习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>方法正是您正在寻找的。它迭代整个子树,考虑任意谓词:

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

http://ilnumerics.net/Cells.html

http://ilnumerics.net/GeneralRules.html

关于c# - 如何过滤 HDF5 文件中的特定对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23248996/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com