我有一个用SWIG包装的c ++实现,并编译成一个可供python使用的模块。
我使用ctypes用ctype参数调用函数,int double等。 my_function(ctype args)的输出是一个int **,即它是一个多维数组。
如何将其转换为python脚本中的2D numpy数组?我一直在寻找ctypes指针,但到目前为止我没有运气。我花了很多时间阅读python和numpy的C-API与SWIG一起使用,并且在c ++端实现返回一个numpy数组到目前为止一直非常难以完全失败。
答案 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