Python / SWIG:按索引返回数组

时间:2015-09-29 20:18:18

标签: python c++ return-value swig

我正在尝试从使用SWIG for Python包装的C ++函数输出值数组。我知道如何使用以下typemap返回C ++数组的简单情况:

%apply (double* ARGOUT_ARRAY1, int DIM1) {(double* output_array, int length)};

使用相关的C ++代码:

void MyClass::retrieveArray(double* output_array, int length) {
    for (int i=0; i<length; i++)
        output_array[i] = _array[i];
}

Python的用法如下:

output_array = my_class_instance.returnArray(length)

但是,我想更进一步,并使用索引将数组返回到多维数组中。所以C ++代码看起来像:

void MyClass::retrieveArray(double* output_array, int length, int index) {
    for (int i=0; i<length; i++)
        output_array[i] = _multi_dimensional_array[index][i];
}

但是,需要更改typemap以适应索引。我试过了:

%apply (double* ARGOUT_ARRAY1, int DIM1, int index) {(double* output_array, 
        int length, int index)};

但这似乎不起作用。我也知道在这种情况下返回数组的大小将是6倍,但我不知道如何将这些信息转发给SWIG。

1 个答案:

答案 0 :(得分:0)

您应该能够应用与以前相同的类型图:

%apply (double* ARGOUT_ARRAY1, int DIM1) {(double* output_array, int length)};

这将匹配double* output_array的参数int lengthMyClass::retrieveArray。要从python调用该函数,请使用:

output_array = my_class_instance.retrieveArray(length, index)

或者,因为您已经知道长度为6:

output_array = my_class_instance.retrieveArray(6, index)

如果在编译时已经知道数组的大小,也可以修改C ​​++代码以使用以下函数签名:

void MyClass::retrieveArray(double output_array[6], int index) {...}

然后使用不同的typemap:

%apply (double ARGOUT_ARRAY1[6]) {(double output_array[6])};

另请参阅我假设您正在使用的documentation for numpy.i