Pythonnet中numpy.array转C#数组:解决PyObject转换难题
Pythonnet中Numpy数组转C#数组的解决方法
当使用Pythonnet从C#调用Python脚本时,若Python函数返回numpy.array类型,无法直接转换为C#的double[]数组,会抛出类型转换错误。以下是两种可行的解决方式:
方式一:在C#侧直接转换Numpy数组(无需修改Python代码)
通过Pythonnet提供的Numpy类型映射,先将返回的PyObject转为numpy.ndarray,再提取数据转换为C#数组:
var input1 = new double[] {15, 20, 25}; dynamic test = Py.Import("Py_file_name"); PyObject resultObj = test.function_name(input1); // 验证是否为Numpy数组并转换 using (var numpy = Py.Import("numpy")) { if (numpy.ndarray.Check(resultObj)) { var npArray = new Python.Runtime.Numpy.NDArray(resultObj); // 转换为一维double数组(若为多维数组需调整处理逻辑) double[] csharpArray = npArray.As<double[]>(); // 后续可直接使用csharpArray } }
注意:使用此方法前需确保Python环境已安装numpy,且C#项目中正确引用Python.Runtime包,同时配置好Pythonnet的运行环境(如设置Python路径、初始化PythonEngine)。
方式二:在Python侧转换为列表后返回(简单高效)
修改Python函数,将numpy.array转为普通列表再返回,C#侧可直接转换为数组:
Python脚本(Py_file_name.py):
import numpy as np def function_name(input_arr): # 原逻辑生成numpy数组 np_result = np.array(input_arr) * 1.5 # 转换为Python列表返回 return np_result.tolist()
C#代码:
var input1 = new double[] {15, 20, 25}; dynamic test = Py.Import("Py_file_name"); double[] r1 = test.function_name(input1) as double[];
这种方式无需处理Numpy的类型映射,代码更简洁,适合对性能要求不极致的场景。
内容的提问来源于stack exchange,提问作者Karls
相关产品推荐
相关产品推荐

