2

我想在 SWIG 中映射一个带有 numpy 数组的 C++ double * vec 类型,所以我阅读了这些文档: http ://docs.scipy.org/doc/numpy/reference/swig.interface-file.html ,尤其是部分“常见示例”和http://www.swig.org/Doc1.3/Python.html#Python_nn18

尽管我使用了 numpy.i 类型映射,但我无法让 SWIG 理解 (int len, double* ivec) 实际上应该是 (int, numpy.array),而不是 numpy 数组?我尝试了以下方法:

/* test3.cpp */

#include <cstring>
#include <iostream>
#include <cmath>


void abel(int len1, double* ivec, int len2, double* ovec)
{
    std::cout << "Hello" << std::endl;

    return;
}

/*test3.h*/

#ifndef TEST3_H_INCLUDED
#define TEST3_H_INCLUDED
#include <cstring>
#include <iostream>
#include <cmath>

void abel(int len1, double* ivec, int len2, double* ovec);

#endif // TEST3_H_INCLUDED

我将 C++ 类型(int size,double* ivec)与 numpy.i类型映射(int DIM1, double* INPLACE_ARRAY1) 链接起来,就像在 scipy doc 中一样

/*test3.i*/

%module Amod

%{
#define SWIG_FILE_WITH_INIT
#include "test3.h"
%}

%include "numpy.i"

%init %{
import_array();
%}

%apply (int DIM1, double* INPLACE_ARRAY1) {(int len1, double* ivec), (int len2, double* ovec)};

%include "test3.h"

我按照文档中的解释进行编译:

swig -c++ -python test3.i
g++ -fPIC -c test3.cpp
g++ -fPIC -c test3_wrap.cxx -I/usr/include/python2.7
g++ -shared test3.o test3_wrap.o -o _Amod.so

我可以毫无问题地在 python 中导入 Amod,但是:

>>>import Amod as ab
>>>import numpy as np
>>>a = np.array([1.0,2.0,3.0])
>>>ab.abel()

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: abel() takes exactly 2 arguments (0 given)


>>>ab.abel(a,a)
Hello


>>>ab.abel(3,a,3,a)

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: abel() takes exactly 2 arguments (4 given)

什么问题 ?为什么整数 arg 消失了?我觉得我错过了一些重要的事情。

非常感谢,对于这个问题,我尽量减少我的代码。我是这里的新手,请不要犹豫告诉我如何激活颜色代码以使其更具可读性。

4

0 回答 0