我正在尝试从使用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。
答案 0 :(得分:0)
您应该能够应用与以前相同的类型图:
%apply (double* ARGOUT_ARRAY1, int DIM1) {(double* output_array, int length)};
这将匹配double* output_array
的参数int length
和MyClass::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。