将ctypes int **转换为numpy 2维数组

时间:2016-09-28 09:32:10

标签: python c++ arrays numpy swig

我有一个用SWIG包装的c ++实现,并编译成一个可供python使用的模块。

我使用ctypes用ctype参数调用函数,int double等。 my_function(ctype args)的输出是一个int **,即它是一个多维数组。

如何将其转换为python脚本中的2D numpy数组?我一直在寻找ctypes指针,但到目前为止我没有运气。我花了很多时间阅读python和numpy的C-API与SWIG一起使用,并且在c ++端实现返回一个numpy数组到目前为止一直非常难以完全失败。

2 个答案:

答案 0 :(得分:0)

我不认为这可以在Python方面完成;它必须使用NumPy的C-API接口在C / C ++层内完成(private function render_view($view=NULL,$data){ if ( ! file_exists(APPPATH.'views/pages/'.$view.'.php')) { // Whoops, we don't have a page for that! show_404(); } $this->load->view('header/header',$data); $this->load->view('pages/'.$view, $data); } public function index() { $data['title'] = 'Homepage'; $this->render_view('home_content',$data); } public function shop() { $data['title']='Shoping'; $this->render_view('shop',$data); } 是相关功能 - 有关详细信息,请参阅this answer)。 Here是Cython脚本中的一个示例。

请注意,在这种情况下,解除分配的处理很复杂:据我所知,没有机制允许numpy自动处理它。您只需要确保在仍然使用numpy包装器的情况下释放数组的任何脚本都不会这样做。

编辑:如果您的PyArray_SimpleNewFromData没有指向连续的内存块,我不相信这会有效。 NumPy只能(轻松)处理连续的数据缓冲区。

答案 1 :(得分:0)

使用NumPy和numpy.i,这很容易

接口标题

#pragma once
void fun(int** outArray, int* nRows, int* nCols);

实施

#include "test.h"
#include <malloc.h>
void fun(int** outArray, int* nRows, int* nCols) {
  int _nRows = 100;
  int _nCols = 150;
  int* _outArray = (int*)malloc(sizeof(int)*_nRows*_nCols);
  *outArray = _outArray;
  *nRows = _nRows;
  *nCols = _nCols;
}

SWIG接口标题

%module example
%{
  #define SWIG_FILE_WITH_INIT
  #include "test.h"
%}

%include "numpy.i"

%init
%{
  import_array();
%}

%apply (int** ARGOUTVIEWM_ARRAY2, int* DIM1, int* DIM2) {(int** outArray, int* nRows, int* nCols)}
%include "test.h"

类型映射ARGOUTVIEWM_ARRAY2创建一个托管的NumPy数组,当在Python中销毁NumPy对象时,会自动调用free。

如果您想使用Python C API自己创建包装器,可以使用numpy.i

查看SWIG生成的代码。