我正在尝试使用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]])
为什么它与原始数组不同?我想知道我在哪里犯错了。
答案 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的其他示例。