【问题标题】:Reading a single element from HDF5 file从 HDF5 文件中读取单个元素
【发布时间】:2017-06-26 08:03:34
【问题描述】:

您能否提供一个使用 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 维数组)。

【问题讨论】:

    标签: c# hdf5


    【解决方案1】:

    使用HDF5 support doc

    假设您的数据集如下:(为简单说明参数如何工作的二维)

    1 2 3
    4 5 6
    7 8 9
    

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

    这意味着您将需要选择数组中的 1 x 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,根据文档描述调用,所以可能会有错误。

    【讨论】:

    • 感谢您的回答。
    • 我的荣幸。此外,您可能需要注意您使用的方法的优缺点。
    【解决方案2】:

    在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());
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-08-31
        • 2017-06-27
        • 2016-06-18
        • 1970-01-01
        • 2015-03-19
        • 1970-01-01
        • 2020-07-31
        相关资源
        最近更新 更多