我正在使用dongwithnumpy.i向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[]);其中一些数组实际上是二维的,其范围由ncoord和nelem参数提供。这是我遇到麻烦的二维数组,因为numpy.i似乎只支持int n1、int n2、double * arr或各种排列(我的C函数不想要这些额外的整数)或double arr[ANY][ANY]。后者看起来很有希望,因为多维C数组只是一个连续的内存块,因此应该与函数所期望的兼容。但当我尝试
%apply (double INPLACE_ARRAY2[ANY][ANY]) {(double imgcrd[]),(double world[])};斯威格(或者更确切地说,是gcc,运行在酒庄的输出)抱怨道:
wcs_wrap.c:3770:7: error: expected expression before ‘,’ token在这里,SWIG为这些参数生成了无效的C代码。
我在这里做的事有可能吗?我想我可以使用%inplace和%rename来创建一个包装器函数,它接受数组的(不必要的)维度,然后调用真正的函数。如果我可以将这些数组作为输出参数返回(它们的尺寸可以基于ncoord和nelem来计算),这甚至比上面使用内嵌数组的方法更好。
或者可能已经存在一个快速(即不是astLib中的) python接口到libwcs,所以我不必这么做?
编辑:我刚刚发现了比目鱼 (它的名字非常明显,我应该在最初的搜索中找到它),它解决了我的根本问题。
Edit2:我想一个包含2d numpy数组的包装器会传递一个扁平的视图来解决这个问题,因为一维数组似乎可以工作。不过,这最终需要一个简单的包装器(.i、_wrap.c、.py和一个额外的.py来进一步包装swig函数以解决维度问题)需要大量的文件。
发布于 2014-02-22 01:24:03
我还缺少一本好的使用numpy.i的食谱。据我所知,你可以:
IN_ARRAY2或INPLACE_ARRAY2)。IN_ARRAY2或INPLACE_ARRAY2)。ARGOUT_ARRAY1)时,当从python调用它时,必须传递大小。在下面的示例中,您将编写oo = func3(20)。原因似乎是因为python需要分配内存,它需要知道大小,例如,您的.i-file可能看起来像他的:
...
%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);当然,您可以组合这些检查博士们以获得更多信息。
https://stackoverflow.com/questions/21942729
复制相似问题