2016-09-28 24 views
1

SWIG로 랩핑 된 C++ 구현을 파이썬에서 사용할 수있는 모듈로 컴파일했습니다.ctypes int **을 numpy 2 차원 배열로 변환합니다.

ctype 인수, int double 등의 함수를 호출하기 위해 ctypes를 사용하고 있습니다. my_function (ctype args)의 출력은 int ** 즉 다차원 배열입니다.

어떻게 이것을 파이썬 스크립트 내에서 2D numpy 배열로 변환 할 수 있습니까? 나는 ctypes 포인터를보고 있었지만 지금까지 나는 운이 없었습니다. 나는 많은 시간을 파이썬의 C-API를 읽고 SWIG와 함께 사용하기 위해 numpy를 보냈다. 그리고 C++ 측에서 numpy 배열을 반환하기 위해 구현하는 것은 지금까지 엄청나게 어렵고 완전히 실패했다.

+0

중복 같은데 사용 꿀꺽 꿀꺽에 의해 생성 된 코드로 볼 수있다. 이 대답은 어떨까요? http://stackoverflow.com/questions/22425921/pass-a-2d-numpy-array-to-c-using-ctypes –

+0

이 질문은이 질문과 중복되는 것으로 보입니다. @TheQuantumPhysicist (numpy -> int ** , not int ** -> numpy) – Eric

+0

'int ** '는 동적으로 할당되어 있는가? 그것을 '삭제'하는 것은 누구의 직업입니까? – Eric

답변

0

나는 이것이 파이썬 측에서 할 수 있다고 생각하지 않는다; NumPy의 C-API 인터페이스 (PyArray_SimpleNewFromData은 관련 함수 임 - 자세한 내용은 this answer 참조)를 사용하여 C/C++ 계층 내에서 수행해야합니다. Here은 Cython 스크립트에서이 예입니다.

이 경우 할당 해제 처리는 복잡합니다. 내가 아는 한 numpy가 자동으로 처리 할 수있는 메커니즘이 없습니다. numpy 래퍼가 여전히 사용되는 경우 배열에서 할당을 해제하는 모든 스크립트가 그렇게하지 않도록해야합니다.

편집 : int**이 인접한 메모리 블록을 가리 키지 않으면이 기능이 작동하지 않는다고 생각합니다. NumPy는 연속 데이터 버퍼 만 처리 할 수 ​​있습니다 (쉽게). NumPy와 및 numpy.i를 사용

+0

이것은 파이썬 측면에서 확실히 할 수 있습니다 (ctypes는 포인터를 역 참조하는 데 필요한 모든 기계를 제공합니다).하지만 numpy는 인접한 데이터 버퍼에서만 작동한다고 말하는 것이 옳습니다. 물론, 데이터가 연속적 일 가능성이 있습니다 (가능하지는 않습니다) – Eric

+0

ctypes를 사용하여 포인터를 조작 할 수 있다는 것을 알고 있지만 파이썬 측에서 numpy의''PyArray_SimpleNewFromData''와 같은 것을 호출 할 수 있다고는 생각하지 않습니다. 행복하게 입증 할 수 있습니다!) – jakevdp

+0

[이 질문에] (https : // stackoverflow.com/questions/4355524/get-data-from-ctypes-array-numpy)는 1D 경우를 해결하고 데이터가 어긋나는 것이므로 이것이 최선의 방법입니다. – Eric

0

,이

인터페이스 헤더

#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; 
} 

꿀꺽 꿀꺽 인터페이스 헤더

%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" 

t 매우 쉽습니다 ypemap ARGOUTVIEWM_ARRAY2은 NumPy 객체가 파이썬에서 소멸 될 때 관리되는 NumPy 배열을 만들고 free가 자동으로 호출됩니다. 당신은 자신이 파이썬 C API를 사용하여 랩퍼를 작성하려면

, 당신은 numpy.i