2013-08-16 17 views
3

我在numpyarray和C++代碼中有兩維數據,我想對這些數據執行一些操作。使用swig和distutils以及numpy.i我設法將所有東西編譯成一個python擴展名「goldstein」,它提供了一個函數unwrap2d。 我使用 當將2d numpy數組傳遞給C++時的TypeError

import goldstein 

data = np.ascontiguousarray(data_temp, dtype='double') 
mask = np.ascontiguousarray(mask_temp, dtype='uint16') 
outdata = np.ones_like(data) 

goldstein.unwrap2d(data,mask,outdata) 

我得到一個TypeError: array cannot be safely cast to required type測試。任何人都可以指出我如何以正確的方式傳遞這些數組?

參考:爲了產生模塊我使用的接口文件

%define DOCSTRING 
"Wrapper for c++-code" 
%enddef 

%module(docstring=DOCSTRING) goldstein 

%{ 
    #define SWIG_FILE_WITH_INIT 
    #include "goldstein.h" 
%} 

/*include numpy typemaps*/ 
%include "numpy.i" 
/*initialize module*/ 
%init %{ 
    import_array(); 
%} 

%rename(unwrap2d) phase_unwrapping_func; 

/* typemaps for the arrays*/ 
%apply (int DIM1,int DIM2,float* IN_ARRAY2) {(int xsize,int ysize,float* in)}; 
%apply (int DIM1,int DIM2,unsigned short* IN_ARRAY2) {(int x1,int y1,unsigned short* mask)}; 
%apply (int DIM1,int DIM2,float* INPLACE_ARRAY2) {(int x2,int y2,float* out)}; 

/*wrapper function calling the original phase_unwrapping using only the needed parameters*/ 
%inline %{ 
void phase_unwrapping_func(int xsize,int ysize,float* in,int x1,int y1,unsigned short* mask,int x2,int y2,float* out) { 
    phase_unwrapping(xsize, ysize, in, mask, out); 
    } 
%} 
+0

我試圖打開語法突出顯示,但我沒有成功...... :( – Dux

+1

你的'data'數組是dtype double的,但是你的C函數期望有一個浮點數,這可能是使NumPy抱怨的原因。 'data = np.ascontiguousarray(data_temp,dtype ='float')'在調用你的函數之前應該注意這一點。 – Jaime

回答

0

@Jaimie是正確的場。像'double'這樣的'float'在numpy中是64位的,這就是爲什麼我沒有再次檢查,我只記得它並不重要。但在C++中浮動顯然需要32位,在numpy中是'float32'。 謝謝!