为 numpy 创建一个简单的 SWIG 类型图

Creating a simple SWIG typemap for numpy

本文关键字:简单 SWIG 类型 型图 一个 创建 numpy      更新时间:2023-10-16

我一直在使用数字python/SWIG/C++组合,使用著名的"numpy.i"SWIG模板文件(ARGOUTVIEW,INPLACE等数组,请参阅:http://docs.scipy.org/doc/numpy-1.10.0/reference/swig.interface-file.html(。

但是,为了真正学习一些东西,我想为 numpy 数组创建我自己的类型图。 首先,只是一些非常简单的事情:

我们在python中有一个字节缓冲区numpy数组,我们想以最简单的方式将其传递给C(++(:C(++(获取指向字节缓冲区的指针(是的,我知道..垃圾收集..危险(。

我已经用以下 swig 代码尝试过这个(注释掉的行和活动行都没有成功(:

%typemap(in) (uint8_t* bytebuffer) {
  PyObject* x_array = PyArray_FROM_OTF($input, NPY_UINT8, NPY_ARRAY_IN_ARRAY);  
  // PyArray* x_array = PyArray_FROM_OTF($input, NPY_UINT8, NPY_ARRAY_IN_ARRAY);
  // PyObject* x_array = PyArray_FROM_O($input);
  // $1 = (uint8_t*)PyArray_DATA(x_array);
  // $1 = (uint8_t*)PyArray_DATA($input);
  $1 = static_cast<uint8_t*>(PyArray_DATA($input));
}

我为每个案例都会得到一些东西,比如:

error: cannot convert ‘PyObject* {aka _object*}’ to ‘PyArrayObject* {aka tagPyArrayObject*}’ for argument ‘1’ to ‘void* PyArray_DATA(PyArrayObject*)’

我已经阅读了一些numpy api(请参阅:http://docs.scipy.org/doc/numpy-1.10.0/reference/c-api.array.html#array-structure-and-data-access(,但我似乎误解了一些东西..没有奇怪的方法可以使这个#%@工作! 帮助!

好的。在分析了"numpy.i"的作用之后,我发现了灵丹妙药:

$1=(uint8_t*)(PyArray_DATA((PyArrayObject*)$input));

对不起,垃圾邮件。