【发布时间】:2014-02-21 18:48:01
【问题描述】:
我正在使用带有 numpy.i 的 SWIG 向 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[])};
SWIG(或者更确切地说是在 SWIG 的输出上运行的 gcc)抱怨:
wcs_wrap.c:3770:7: error: expected expression before ‘,’ token
这里 SWIG 为这些参数生成了无效的 C 代码。
我在这里尝试做的可能吗?我想我可以使用 %inplace 和 %rename 来创建一个包装函数,该函数确实接受数组的(不必要的)维度,然后调用真正的函数。如果我可以将这些数组作为输出参数返回(它们的尺寸很容易根据ncoord 和nelem 计算,那么比上面使用就地数组的方法更好。
或者也许已经存在一个快速(即不是 astLib 中的那个)python 接口到 libwcs,所以我不必这样做?
编辑:我刚刚发现了pywcs(它的名字很明显,我应该在我最初的搜索中找到它),它解决了我的潜在问题。
Edit2:我猜一个包含 2d numpy 数组并传递它的扁平视图的包装器会解决这个问题,因为 1d 数组似乎可以工作。尽管如此,对于一个简单的包装器(.i、_wrap.c、来自 swig 的 .py 和一个额外的 .py 来进一步包装 SWIG 函数以解决维度问题),最终还是需要大量文件。
【问题讨论】:
标签: python c numpy swig libwcs