Я хочу получить доступ к функции C, которая возвращает структуру, содержащую двойные массивы (где длины этих массивов задаются другими членами int структуры) из python. Объявление
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-wrapping дает мне структуру просто отлично, но все члены double*
<Swig Object of type 'double *' at 0x348c8a0>
, что делает их бесполезными. Я играл с файлом интерфейса NumPy SWIG, но не мог заставить любую модель, например, ( DATA_TYPE* INPLACE_ARRAY1, int DIM1 )
работать (я думаю, что невозможно привести их в соответствие в этом случае, но я был бы счастлив, если бы оказался ошибочным).
Я предполагаю, что мне пришлось бы передавать инициализацию кода массивов NumPy как PyArrayObject
для этих членов, а SWIG расширять мою структуру, чтобы сделать их доступными в Python? Это похоже на большую работу. Может ли кто-нибудь лучше использовать SWIG? Можно было бы изменить структуру или метод, возвращающий ее, если это облегчит задачу.
В качестве альтернативы я посмотрел на cython и ctypes. Будет ли это лучше подходит для того, чего я пытаюсь достичь? Я не использовал cython, поэтому не могу судить об этом. Для ctypes я могу представить себе, как это сделать, но это означает, что я пишу вручную то, что, как я надеялся, может сделать для меня достаточно автоматическая обертка.
Любые предложения с благодарностью получили!