如何将3d和4d numpy.array传递给swig

时间:2014-03-05 08:37:02

标签: python numpy swig

我正在使用python来计算某些东西,但我想让它更快。所以我用了swig。

我想在同一个函数中使用3d数组和4d数组。

swig.i

%apply (double *INPLACE_ARRAY3, int DIM1, int DIM2, int DIM3)\
{(double *trans, int trans_dim1, int trans_dim2, int trans_dim3)};

%apply (double *INPLACE_ARRAY4, int DIM1, int DIM2, int DIM3, int DIM4)\
{(double *sample,int sam_dim1, int sam_dim2, int sam_dim3, int sam_dim4)};

sample.h

void update_transition(double *trans,int trans_dim1,int trans_dim2, int trans_dim3,
 double *sample,int sam_dim1, int sam_dim2, int sam_dim3, int sam_dim4, double DENO);

但是当我在python中使用它时,错误:

**TypeError: update_transition() takes exactly 7 arguments (3 given)**

这意味着我的3d数组可以被swig识别,但4d数组不能?如何解决这个问题呢?我想要他们两个。

2 个答案:

答案 0 :(得分:1)

Python说它希望函数调用有7个参数。 C ++函数需要10.如果SWIG能够同时应用这两种类型图,那么Python函数会期望3而不是7.从10到7的唯一方法是让SWIG错过第二个类型映射;所以它能够匹配你的函数的第一个数组,但不能匹配第二个数组。要确认这一点,请使用10.3.6 Debugging typemap pattern matching中提到的一些技巧。另请查看生成的代码。您可能想要尝试的一件事是5-paramater C ++测试函数,它采用1D数组和2D数组,使用INPLACE_ARRAY1和2导出2参数Python函数。这是一个更简单的案例要解决。

如果这不能解决问题,但会为您提供有用的信息,请将其添加到您的问题中,也许我或其他人可以再看看。

答案 1 :(得分:0)

感谢Schollii的帮助。这似乎是因为它无法识别4d阵列,,尤其是 numpy.i没有实现这一部分。所以我只是编写一个类似于numpy.i编写的3d数组,并将numpy.i添加到makefile中。

有效!