从HDF5文件中读取单个元素

时间:2017-02-08 15:47:18

标签: c# hdf5

您能否提供一个使用HDF5DotNet库从HDF5文件中读取单个元素的示例。我知道如何将完整数组读入内存并通过索引选择必要的元素。我不想阅读完整数组并希望使用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 个答案:

答案 0 :(得分:1)

使用HDF5 support doc

假设您的DataSet如下所示:(2D以简化说明参数如何工作)

1 2 3
4 5 6
7 8 9

您想要选择 6 ,只选择 6 。 这意味着您需要一个位于第二行和第三列的元素。 (一个索引)。

这意味着您需要在选择数组中使用1乘2的点阵列。 (零索引)。

1 2

如果你想同时选择7,那么选择数组将如下所示。 (零索引)。

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数据空间,我们只需在选择数组中添加一个额外的值。

那是:

1 2 0

将选择点(2,3,1)

如果要选择第二个值,则选择数组将如下所示。 (零索引)。

1 2 0 1 2 1

将选择点(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,根据文档描述调用,因此可能存在错误。

答案 1 :(得分:0)

我找到了另一种解决问题的方法 - 使用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));

答案 2 :(得分:0)

在C#中使用HDFql,可以按如下方式读取三维数据集中的一个特定元素(假设数据集名为HDFql.Execute("SELECT FROM my_dataset(2, 3, 5)"); ,要读取的元素位于第2,3位和第一维,第二维和第三维分别为5):

my_dataset

从那里,您可以通过执行以下操作来检索元素(假设HDFql.CursorFirst(); System.Console.WriteLine("Element is " + HDFql.CursorGetInt()); 的数据类型为整数):

Spark