我正在使用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数组不能?如何解决这个问题呢?我想要他们两个。
答案 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中。
有效!