c# - 在 C# 中从 HDF5 文件加载数据集
问题描述
我正在尝试从 C# (.NET Framework) 中的 HDF5 文件加载数据集,以便将内容保存在数组中,例如float[,]
. 我找到了HDF.PInvoke库,但我发现很难弄清楚如何使用它。
更新
从Soonts 的回答中,我设法让它工作。这是我的工作片段:
using System;
using System.Runtime.InteropServices;
using HDF.PInvoke;
namespace MyNamespace
{
class Program
{
static void Main()
{
string datasetPath = "/dense1/dense1/kernel:0";
long fileId = H5F.open(@"\path\to\weights.h5", H5F.ACC_RDONLY);
long dataSetId = H5D.open(fileId, datasetPath);
long typeId = H5D.get_type(dataSetId);
// read array (shape may be inferred w/ H5S.get_simple_extent_ndims)
float[,] arr = new float[162, 128];
GCHandle gch = GCHandle.Alloc(arr, GCHandleType.Pinned);
try
{
H5D.read(dataSetId, typeId, H5S.ALL, H5S.ALL, H5P.DEFAULT,
gch.AddrOfPinnedObject());
}
finally
{
gch.Free();
}
// show one entry
Console.WriteLine(arr[13, 87].ToString());
// Keep the console window open in debug mode.
Console.WriteLine("Press any key to exit.");
Console.ReadKey();
}
}
}
原始的第一次尝试:
到目前为止我所管理的:
using System;
using System.IO;
using System.Runtime.InteropServices;
using HDF.PInvoke;
namespace MyNamespace
{
class Program
{
static void Main()
{
string datasetPath = "/dense1/dense1/bias:0";
long fileId = H5F.open(@"\path\to\weights.h5", H5F.ACC_RDONLY);
long dataSetId = H5D.open(fileId, datasetPath);
long typeId = H5D.get_type(dataSetId);
long spaceId = H5D.get_space(dataSetId);
// not sure about this
TextWriter tw = Console.Out;
GCHandle gch = GCHandle.Alloc(tw);
// I was hoping that this would write to the Console, but the
// program crashes outside the scope of the c# debugger.
H5D.read(
dataSetId,
typeId,
H5S.ALL,
H5S.ALL,
H5P.DEFAULT,
GCHandle.ToIntPtr(gch)
);
// Keep the console window open in debug mode.
Console.WriteLine("Press any key to exit.");
Console.ReadKey();
}
}
}
的签名H5F.read()
是:
Type Name Description
--------------------------------------------------------------
long dset_id Identifier of the dataset read from.
long mem_type_id Identifier of the memory datatype.
long mem_space_id Identifier of the memory dataspace.
long file_space_id Identifier of the dataset's dataspace in the file.
long plist_id Identifier of a transfer property list for this I/O operation.
IntPtr buf Buffer to receive data read from file.
问题
谁能帮我在这里填空?
解决方案
您需要创建一个大小和类型正确的数组(正常的一维数组,而不是二维数组)。然后写这样的东西:
int width = 1920, height = 1080;
float[] data = new float[ width * height ];
var gch = GCHandle.Alloc( data, GCHandleType.Pinned );
try
{
H5D.read( /* skipped */, gch.AddrOfPinnedObject() );
}
finally
{
gch.Free();
}
这会将数据集读入data
数组,然后如果需要,您可以将单独的行复制到另一个二维数组中。
阅读 API 文档如何获取维度(HDF5 支持任意维度的数据集)和数据集的大小(对于 2D 数据集,大小为 2 个整数),即如何找出所需的缓冲区大小(对于 2D 数据集,它是width * height
)。
至于元素类型,你最好提前知道,例如float
很好。
推荐阅读
- ruby - 理解Ruby中Proc.curry方法的arity参数
- python - 用于一维输入的 LSTM - TensorFlow 异常
- php - 在 WooCommerce 中启用自定义条件注册字段验证
- html - 将固定位置的 div 嵌套在固定位置的 div 中
- microcontroller - 如何从 main() 和 IRQ() 函数访问变量?
- c# - 从 .NET-core 中的 ODataV4 元数据 XML 中提取类
- javascript - React 上下文测试 - 在 HOC 中模拟消费者
- ios - Swift 4 正确移除面具
- javascript - 如何从字符串数组中删除字符串?
- sql-server - 如何从 SQL 服务器 \\Abc\Abc\Abc\Abc\Abc\Abc\ERROR.docx 中的以下字符串中获取 ERROR.docx