我有大量用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);
};
答案 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"]);