我有一些C代码,其中有以下声明:
int myfunc(int m, int n, const double **a, double **b, double *c);
所以a
是一个常量二维数组,b
是一个二维数组,c
是一个一维数组,它们都是动态分配的。在传递给myfunc
之前,b
和c
不需要特别的内容,并且应该被理解为输出信息。对于这个问题,我不允许改变myfunc
的声明。
问题1:如何将给定的numpy数组a_np
转换为这个C函数所需的格式的数组a
,以便我可以在Cython中使用a
调用此C函数?
问题2:b
和c
的声明是否正确,或者它们需要以其他格式来使C函数能够将它们理解为2D和1D数组(分别)?
我的尝试:
myfile.pxd
cdef extern from "myfile.h":
int myfunc(int p, int q, const double **a, double **b, double *c)
mytest.pyx
cimport cython
cimport myfile
import numpy as np
cimport numpy as np
p = 3
q = 4
cdef:
double** a = np.random.random([p,q])
double** b
double* c
myfile.myfunc(p, q, a, b, c)
然后在iPython中运行以下命令:
import pyximport; pyximport.install()
import mytest
定义变量a
的那行代码会提示错误信息:无法将Python对象转换为'double **'
。关于变量b
和c
没有出现任何错误信息,但由于我目前无法运行C函数,因此不确定变量b
和c
的声明是否正确(即能使C函数分别输出2D和1D数组)。
其他尝试:我还尝试了遵循这里的解决方案,但这不能处理我在myfunc
声明中使用的双星号类型的数组。 这里的解决方案不适用于我的任务,因为我无法更改myfunc
的声明。
myfunc
之外?而且由于你试图将 numpy 数组传递给myfunc
,所以这是无关紧要的,你只需要将这些 numpy 数组转换为适当的参数格式(double 和 single 指向 double 的指针),对吗? - user707650myfunc
计算数组b
和c
,我不需要它们是动态分配的或者有什么特殊的东西。我之所以称它们为“动态分配”,只是因为我认为双指针和单指针到 double 都需要这种格式。简而言之,是的,你是正确的。 - Alexdouble**
与 numpy 不太匹配。请参见 https://dev59.com/614c5IYBdhLWcg3wqLte 进行讨论。 - DavidW