SWIG:将2dnumpy数组传递给C函数f(double a[])

2024-09-29 17:18:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我将SWIG与numpy一起使用,我向python公开一个C库。我试图包装的函数接受一系列double数组作为参数:

int wcsp2s(struct wcsprm *wcs, int ncoord, int nelem, const double pixcrd[], double imgcrd[], double phi[], double theta[], double world[], int stat[]);

其中一些数组实际上是二维的,范围由ncoordnelem参数给出。正是这些二维数组我遇到了麻烦,因为numpy.i似乎只支持int n1int n2double * arr或各种置换(我的C函数不需要那些额外的整数)或double arr[ANY][ANY]。后者看起来很有前途,因为多维C数组只是一个连续的内存块,因此应该与函数所期望的兼容。但当我试着

^{pr2}$

SWIG(或者更确切地说是gcc在SWIG的输出上运行)抱怨:

wcs_wrap.c:3770:7: error: expected expression before ‘,’ token

这里SWIG为这些参数生成了无效的C代码。在

我想在这里做什么?我想我可以使用%inplace和%rename来创建一个包装函数,它接受数组的(不必要的)维度,然后调用real函数。如果我可以将这些数组作为输出参数返回(它们的维数很容易根据ncoordnelem来计算,那就更好了。在

或者可能libwcs已经有了一个快速的(即不是astLib中的)python接口,所以我不必这样做?在

编辑:我刚刚发现了pywcs(它有一个非常明显的名字,我应该在最初的搜索中找到它),它解决了我的根本问题。在

编辑2:我想如果一个包装器接受一个2d numpy数组,并在它的平面视图上传递它,就可以解决这个问题,因为1d数组似乎可以工作。不过,最终还是需要大量的文件用于简单的包装器(.i,_wrap.c,.py来自swig)和一个附加的.py来进一步包装swig函数来解决维度问题。在


Tags: 函数pynumpy编辑参数any数组swig
1条回答
网友
1楼 · 发布于 2024-09-29 17:18:14

我还缺少一本使用numpy.i的好食谱。据我所知,你可以:

  • 传递动态大小的数组,其中维度也作为函数参数传递。如果函数的行为不同,则编写一个包装器(例如,IN_ARRAY2或{})。在
  • 传递固定大小的数组(例如,IN_ARRAY2或{})。在
  • 当返回数组(例如,ARGOUT_ARRAY1)时,必须在从python调用数组时传递大小。在下面的示例中,您将编写oo = func3(20)。原因似乎是因为python需要分配内存,它需要知道内存的大小

例如,您的.i-文件可能看起来像他的:

...
%include "numpy.i"

%init %{
  import_array();
%}

// Pass  array of dynamic size:
%apply (double* INPLACE_ARRAY2, int DIM1, int DIM2) {(double *xx, int xx_n, int xx_m)};
void func1(double *xx,int xx_n, int xx_m);

// Pass array of fixed size:
%apply (int *INPLACE_ARRAY2[ANY][ANY]) { (double yy[4][4]) };
void func2(double yy[4][4]);

// Return a dynamic 1D array:
%apply (double* ARGOUT_ARRAY1, int DIM1) {(double* out, int out_n)}
void func3(double* out, int out_n);

当然,您可以组合这些-checkthe Docs以获取更多信息

相关问题 更多 >

    热门问题