我正在尝试在cython中编写一个函数,该函数应该从python接收一个list参数,通过在C / C ++中生成它的2D数组,然后将其作为2D列表返回到python,以某种方式操作它。我简化了代码来问我的问题:
我希望c_Func
执行我可以编译它而没有错误的过程。第二个函数是可调用函数,但显然它不起作用。首先,我必须解决double*
无法替换列表的问题,其次是py_Func
无法返回double*
的问题。那我该怎么改变这两个呢?
cdef double** c_Func(int dim,double* init_val):
cdef double** frozen_ans= <double**> malloc(dim*sizeof(double))
frozen_ans[0]=init_val
return frozen_ans
def py_Func(int dim, double* init_val):
return c_Func(dim,init_val)
答案 0 :(得分:2)
我假设你想操纵C / C ++中的数据。
不要使用malloc,因为您以后无法释放该指针,并且您的代码会泄漏内存。请使用python稍后可以处理的容器,例如numpy数组。
使用'handle'我的意思是当numpy数组在python垃圾收集器中结束时,python将为你释放该内存块。
扩展numpy选项,你可以在cython中创建一个连续的,c风格的numpy数组arr
,使用它的地址&arr[0]
填充/使用纯c代码作为交流数组(只要它不是空的),然后将其作为python numpy.ndarray
对象返回。有关numpy对象的便捷访问,请参阅this。这具有arr
的强大优势,可以从c代码中视为c数组。
在你的cython函数结束时,如果你不想返回一个numpy数组,你可以使用arr.tolist()
方法,但这会产生开销,因为你正在创建一个新的列表。 / p>
关于输入部分,您说您的函数必须接受python列表。它可以:
l
,将其转换为带有np.ascontiguousarray(l)
的numpy数组,操纵它并返回它。在这种情况下,你会产生一个复制开销,但你可以做的很少。