从 HDF5 文件中读取单个元素

Reading a single element from HDF5 file

能否请您提供一个使用 HDF5DotNet 库从 HDF5 文件读取单个元素的示例。我知道如何将整个数组读入内存并 select 按索引读取必要的元素。我不想读取完整数组并想使用H5S.selectElements方法的问题(http://hdf5.net/api/M_HDF5DotNet_H5S_selectElements_4_9e6f2387.aspx)。
到目前为止,我已经创建了以下内容:

H5.Open();
H5FileId fileId = H5F.open(this.filePath, H5F.OpenMode.ACC_RDONLY);
var dSet = H5D.open(fileId, "/Link");
var dSpace = H5D.getSpace(dSet);
var dDims = H5S.getSimpleExtentDims(dSpace);
var dType = H5D.getType(dSet);

H5S.selectElements(dSpace, H5S.SelectOperator.SET, InpPtr numElements,long [] coord);

我不知道如何定义元素的 numElements 参数和坐标(我有 3 维数组)。

使用 HDF5 support doc

假设您的数据集如下:(为简单起见解释参数如何工作的 2D)

1 2 3
4 5 6
7 8 9

并且您想要 select 6 且仅 6。 这意味着您希望一个元素位于第二行和第三列。 (一个索引)。

这意味着您将需要 selection 数组中的 1 x 2 点数组。 (零索引)。

1 2

如果您还想 select 7,那么 selection 阵列将如下所示。 (零索引)。

1 2 2 0

相关调用为:

H5S.selectElements(dSpace, H5S.SelectOperator.SET, 1, new long [] { 1, 2 });
H5S.selectElements(dSpace, H5S.SelectOperator.SET, 2, new long [] { 1, 2, 2, 0 });

转换为 3D 数据空间,我们只需向 selection 数组添加一个额外值。

即:

1 2 0

请问select点(2,3,1)

如果您想 select 第二个值,那么 selection 数组将如下所示。 (零索引)。

1 2 0 1 2 1

请问select点(2,3,1),(2,3,2).

相关调用为:

H5S.selectElements(dSpace, H5S.SelectOperator.SET, 1, new long [] { 1, 2, 0 });
H5S.selectElements(dSpace, H5S.SelectOperator.SET, 2, new long [] { 1, 2, 0, 1, 2, 1 });

注意:本人没用过HDF5,根据文档描述调用,所以可能会有错误。

我找到了另一种解决问题的方法 - 使用 H5S.selectHyperslab 方法。也许它不是那么优雅,但它似乎工作正常。

H5.Open();
H5FileId fileId = H5F.open(this.filePath, H5F.OpenMode.ACC_RDONLY);
var dSet = H5D.open(fileId, "/Link");
var dSpace = H5D.getSpace(dSet);
var dDims = H5S.getSimpleExtentDims(dSpace);
var dType = H5D.getType(dSet);
//E.g. to extract the value with coordinates [0,1,0]:
H5DataSpaceId memspaceid = H5S.create_simple(1, new long[] { 1, 1, 1 });
H5S.selectHyperslab(memspaceid, H5S.SelectOperator.SET, new long[] { 0, 1, 0 }, new long[] { 1, 1, 1 });
H5S.selectHyperslab(dSpace, H5S.SelectOperator.SET, new long[] { 0, 1, 0 }, new long[] { 1, 1, 1 });

//array to read data
double[] readDataBank = new double[1];
H5DataTypeId typeId = new H5DataTypeId(H5T.H5Type.NATIVE_DOUBLE);
H5D.read(dSet, dType, memspaceid, dSpace,new H5PropertyListId(new H5P.Template()), new H5Array<double>(readDataBank));

在C#中使用HDFql,读取三维数据集的一个特定元素可以如下完成(假设数据集被称为my_dataset并且要读取的元素在位置2,一维、二维、三维分别为3和5):

HDFql.Execute("SELECT FROM my_dataset(2, 3, 5)");

从那里,您可以通过执行以下操作检索元素(假设 my_dataset 是整数数据类型):

HDFql.CursorFirst();
System.Console.WriteLine("Element is " + HDFql.CursorGetInt());