如何使用HDF.PInvoke编写数据集?

时间:2019-11-26 09:46:27

标签: c# hdf5

我正在尝试使用HDF.PInvoke将数组写入C#中的HDF5文件中。

我编写了一个简单的程序,将3x3数组写入HDF5文件,但是当我打开它时,结果与数组不同。

using HDF.PInvoke;
using System.Globalization;
using System.IO;

using System.Runtime.InteropServices;


namespace WindowsFormsApp3
{
    public unsafe partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            string currentPath = Path.GetDirectoryName(Application.ExecutablePath);     
            Directory.SetCurrentDirectory(currentPath);                                 

            long file_id = H5F.create(@"weights.h5", H5F.ACC_TRUNC, H5P.DEFAULT, H5P.DEFAULT);

            int[,] arrInt3 = { { 1, 2, 3 }, { 3, 2, 1 }, { 3, 2, 1 } };

            ulong[] dims = {3,3};

            long space_id = H5S.create_simple(2, dims, null);      

            long dataset_id = H5D.create(file_id, "/dset", H5T.STD_I32BE, space_id, H5P.DEFAULT, H5P.DEFAULT, H5P.DEFAULT);

            GCHandle pinnedArray = GCHandle.Alloc(arrInt3, GCHandleType.Pinned);
            IntPtr pointer = pinnedArray.AddrOfPinnedObject();

            long write_id = H5D.write(dataset_id, H5T.NATIVE_INT32, H5S.ALL, H5S.ALL, H5P.DEFAULT, pointer);


            long status = H5D.close(dataset_id);
            long status2 = H5S.close(space_id);
            long status3 = H5F.close(file_id);
        }
    }
}

当我用Python打开文件时,结果是

>>> f.root.dset
/dset (Array(1, 2)) ''
  atom := Int32Atom(shape=(), dflt=0)
  maindim := 0
  flavor := 'numpy'
  byteorder := 'big'
  chunkshape := None

>>> f.root.dset[:]
array([[0, 0]])

为什么它与原始数组不同?我想知道我在哪里犯错了。

1 个答案:

答案 0 :(得分:0)

不确定如何使用HDF.PInvoke进行此操作,但是,如果您未绑定到此特定库,则可能需要检查HDFql(因为它大大简化了处理HDF5文件的方式)。

在C#中使用HDFql将3x3阵列写入HDF5文件可以完成以下操作:

public Form1()
{
    InitializeComponent();

    string currentPath = Path.GetDirectoryName(Application.ExecutablePath);     

    Directory.SetCurrentDirectory(currentPath);    

    HDFql.Execute("CREATE TRUNCATE FILE weights.h5");

    int[,] arrInt3 = { { 1, 2, 3 }, { 3, 2, 1 }, { 3, 2, 1 } };

    HDFql.Execute("CREATE DATASET weights.h5 /dset AS INT(3, 3) VALUES FROM MEMORY " + HDFql.VariableTransientRegister(arrInt3));
}

请检查此webpage,以获取有关如何在C#中使用HDFql的其他示例。