我想从Python访问返回一个包含双精度数组的结构体的C函数(其中这些数组的长度由结构体的其他int成员给出)。声明如下:
typedef struct {
int dim;
int vertices;
int quadrature_degree;
int polynomial_degree;
int ngi;
int quadrature_familiy;
double *weight; /* 1D: ngi */
double *l; /* 2D: ngi * dim */
double *n; /* 2D: ngi * vertices */
double *dn; /* 3D: ngi * vertices * dim */
} element;
extern void get_element(int dim, int vertices, int quad_degree, int poly_degree, element* e);
重要的一点是我希望能够访问所有double*
成员,作为正确形状的NumPy数组(即,dn
应该作为3D数组可访问)。简单地用SWIG包装可以很好地给出结构体,但是所有的
double*
成员都是<Swig Object of type 'double *' at 0x348c8a0>
,这使它们无用。我尝试过使用NumPy SWIG接口文件进行操作,但无法使任何类型映射(例如(DATA_TYPE* INPLACE_ARRAY1, int DIM1)
)工作(我认为在这种情况下不可能匹配,但如果有证据证明我错了,我会很高兴)。我猜想我需要手动编写初始化NumPy数组的代码作为这些成员的
PyArrayObject
,并扩展我的结构体以使它们在Python中可访问?这看起来像是很多工作。有人能否看到使用SWIG更好的方法?如果这些可以使事情变得更容易,那么更改结构或返回它的方法也是可行的。另外,我看了看cython和ctypes。它们是否更适合我想要实现的东西?我没有使用过cython,所以无法评估它的包装能力。对于ctypes,我可以大致想象如何实现,但这意味着手动编写我原本希望由相当自动化的包装器为我完成的内容。
非常感谢任何建议!
get_element(1,2,3,6)
,但出现了错误 ValueError: 数组太大;arr.size * arr.dtype.itemsize
大于最大可能的大小。 - Pygirl