如何将numpy .npz文件直接读取到C#中

时间:2019-04-25 15:40:30

标签: c# python numpy

我有大量用python编写的numpy .npz格式的数据文件。 由于某些原因,我想将它们直接读入C#。
数据文件包含许多不同类型的一维数组-有些将按字节数组,而另一些将按双精度数组。 谁能给我一些有关如何实现这一目标的建议?否则我在下面可能做错了什么?

我尝试使用Accord.NET.NPZFormat,但不知道如何使其工作。我认为可能是因为您必须给它一个返回的类型,并且因为数组是不同类型的,所以它会失败。 这是它的链接: http://accord-framework.net/docs/html/M_Accord_IO_NpzFormat_Load__1.htm

我在这里语法上很挣扎,不确定使用什么作为“ T”。我得到的最接近的是以下内容,但结果中似乎没有任何数据。 Accord.IO没有示例代码。

public static void LoadNPZ(string zip_file, string npz_file)
{
  byte[] ret = new byte[0];
  using (ZipArchive zip = ZipFile.OpenRead(zip_file))
  {
    foreach (ZipArchiveEntry entry in zip.Entries)
    {
      if (entry.Name == npz_file + ".npz")
      {
        Stream fs = entry.Open();
        ret = new byte[fs.Length];
        fs.Read(ret, 0, (int)fs.Length);
      }
    }
  }
  if (ret.Length==0)
  {
    return;
  }

  var ret2 = NpzFormat.Load<object[]>(ret);
};

2 个答案:

答案 0 :(得分:0)

我使用C#和python相当多,我的建议是创建一个COM服务器

http://timgolden.me.uk/pywin32-docs/html/com/win32com/HTML/QuickStartServerCom.html

然后在python中,您可以简单地拥有类似内容

import numpy as np

class NPtoCSharp:
    _reg_clsid_ = "{7CC9F362-486D-11D1-BB48-0000E838A65F}"
    _public_methods_ = ['load_file']

    _public_attrs_ = ['arr', 'the_file']

    _reg_desc_ = "Python NPZ Loader"

    _reg_progid_ = "NPtoCSharp"
    def __init__(self):

        self.arr = None
        self.the_file = None
    def load_file(self):

        self.arr = np.load(self.the_file)

        return self.arr

然后用C#

public void init_python()
{
    Type NPtoCSharp = Type.GetTypeFromProgID("NPtoCSharp");
    NPtoCSharpInst = Activator.CreateInstance(NPtoCSharp);
    NPtoCSharpInst.the_file = 'myfile.npz';
}

虽然不完整,但我希望你能理解。

答案 1 :(得分:0)

您可以使用 NumSharp 库。

假设您在 Python 中创建了这些数据。

import numpy as np

arr = np.array([1,2,3,4])
single = arr.astype(np.single)
double = arr.astype(np.double)

np.savez('single.npz', data=single)
np.savez('double.npz', data=double)

阅读它们的 C# 代码如下。

using NumSharp;

var singleContent = np.Load_Npz<float[]>("single.npz");
var singleNDArray = np.array(singleContent["data.npy"]); // type is NDArray
var singleArray = singleNDArray.ToArray(float); // type is float[]

var doubleContent = np.Load_Npz<double[]>("double.npz");
var doubleNDArray = np.array(doubleContent ["data.npy"]); // type is NDArray
var doubleArray = doubleNDArray.ToArray(double); // type is double[]

如果您没有为数组指定名称,则默认名称为 arr_0,C# 代码将如下所示。

var singleNDArray = np.array(singleContent["arr_0.npy"]);
var doubleNDArray = np.array(doubleContent["arr_0.npy"]);