【发布时间】:2018-09-06 13:04:37
【问题描述】:
尝试将 Numpy 数组传递给 C 方法并在那里修改其内容,这是否可能?我们的想法是尽可能少地复制数据(速度和内存原因)。
目前正在尝试这样的事情:
test.c:
void testMethod(int** values) {
// code
*values = other_pointer;
}
test.i:
/* File : test.i */
%module test
%{
#define SWIG_FILE_WITH_INIT
%}
%include "numpy.i"
%init %{
import_array();
%}
%{
extern void testMethod(int** values);
%}
%apply (int **ARGOUT_ARRAY1) {int **values};
extern void testMethod(int** values);
我修改了 numpy.i 文件添加:
%typemap(in,
fragment="NumPy_Fragments")
(DATA_TYPE **ARGOUT_ARRAY1)
(PyArrayObject* array=NULL, int is_new_object=0, DATA_TYPE* temp=NULL)
{
array = obj_to_array_contiguous_allow_conversion($input,
DATA_TYPECODE,
&is_new_object);
temp = (DATA_TYPE*) array_data(array);
$1 = &temp;
}
%typemap(argout)
(DATA_TYPE** ARGOUT_ARRAY1)
{
$result = SWIG_Python_AppendOutput($result,(PyObject*)array$argnum);
}
运行它:
input = numpy.array([1,2,3])
test.testMethod(input)
有效,即它可以编译,我可以在 C 中打印数组的内容,但输入的内容保持不变。
【问题讨论】: