2013-05-06 32 views
1

我在C++中編寫了一個python擴展來處理numpy數組。 我有內存問題。Python/Numpy C++擴展:內存問題

在調用擴展之前,我有一個值大於0的3D numpy數組。 一旦我在延長我得到使用該功能的numpy的數組:

PyArrayObject * myArray = NULL; 

if (!PyArg_ParseTuple(args, "O!", 
    &PyArray_Type,&myArray)) return NULL; 

使用應借參考蟒蛇所以,我直接進入我的numpy的陣列「啊!」。

然後我訪問數據:

float * myData = (float *) myArray->data; 

int nbFrames = array -> dimensions[0]; 
int nbRows = array -> dimensions[1]; 
int nbCols = array -> dimensions[2]; 

後來我檢查,存在於myArray的值仍然爲正:

for(int i = 0 ; i < nbFrames; i ++){ 
    for(int j = 0 ; j < nbRows; j ++){ 
     for(int k = 0 ; k < nbCols; k++){ 
      if(myData[ i * nbCols * nbRows + j * nbCols + k ] < 0){ 
       perror("Value < 0\n"); 
       exit(1); 
      } 
     } 
    } 
} 

每次我碰到的情況時,該值爲< 0這不僅僅是「-0.0000」,而是「-19.73」。

那麼,有沒有人遇到過這種問題,或者沒有人知道它來自哪裏以及如何解決它?

+0

你確保numpy的陣列是連續的? print arr.flags ['C_CONTIGUOUS']另外,您確定您的numpy數組的每個值的位數與您的浮點數相同嗎? – 2013-05-06 11:01:36

+0

完美!非常感謝你!!那實際上是問題所在。我的數組不是C連續的。這是'對齊'。 – user1314776 2013-05-06 12:04:10

回答

2

對於那些會閱讀此問題的人,回答是由我提問的sega_sai提供的。 訣竅是確保數組是C連續的。要做到這一點,可以在創建陣列時既可以使用選項「命令=‘C’」,例如:

a = np.array([1,2,3,4],order='C') 

(更多信息參見numpy的參考:http://docs.scipy.org/doc/numpy/reference/generated/numpy.array.html)或通過轉換它爲AC連續的數組這樣做的:

np.ascontiguousarray(a) 

(如需更多信息,請參閱numpy的參考http://docs.scipy.org/doc/numpy/reference/generated/numpy.ascontiguousarray.html