2016-11-30 91 views
0

經過漫長的鬥爭之後,我設法成功地將一個numpy數組導入到C中,並返回一個具有相同大小的空numpy數組。現在我想對給定的3x3內核執行卷積。我用來創建第二個執行操作的C函數,而來自python的可調用函數只是將輸入參數轉換爲將它們傳遞給函數。所以我希望做的是:將numpy-C數組轉換爲C double * []並返回

  1. 從蟒蛇收到numpy的陣列
  2. 將其轉換爲C-雙陣列
  3. 進行卷積(離開這個我現在)
  4. 轉換將複數數組返回到C-numpy數組
  5. 將C-numpy數組返回到python。

因此,步驟1和5已經完成。代碼:

static PyObject *CPtest_convolute(PyObject *self, PyObject *args) 
{ 
    PyArrayObject *in_array; 
    PyObject *out_array; 

    /*extract input array, create output array*/ 
    if (!PyArg_ParseTuple(args, "O!", &PyArray_Type, &in_array)) return NULL; 

    /*convert numpy to double*[]*/ 
    /*convArr = convolute(in_array, kernel);*/ 

    out_array = PyArray_NewLikeArray(in_array, NPY_ANYORDER, NULL, 0); 
    if (out_array == NULL) 
     /*for now, i am not going to throw an error, instead return 0. 
      python can use that 0 to throw the error */ 
     return Py_BuildValue("i", 0); 

    /*convert convArr to out_array*/ 

    return out_array; 
}; 

進一步指出,我使用Python 2.7在Windows 8的PyMODINIT_FUNC和PyMethodDef正確初始化(這意味着,沒有任何錯誤和正確的結果)。雖然我找到了多個結果,但他們都使用了ctypes或swig,而不是c。儘管我在C中有點新,但我熟悉基本知識(來自Arduino C)。

在此先感謝!

+0

爲什麼不直接在python中做這一切? – Julien

+0

@JulienBernu,因爲python是一個'非常緩慢'的語言。我寫的簡單比較代碼導致用C寫的相同代碼比python快大約200倍。我想在2592x1944圖像上進行卷積,用簡單的任務完成巨大的循環。該程序旨在執行實時圖像操作。 1-2秒只是卷積太長 – Petrus1904

+0

原生python速度慢,是的(雖然不是總是),但numpy與C幾乎相同,並且不必重新發明輪子。 – Julien

回答

0

通常你可以通過調用(在python)得到numpy的數組的指針:

arr.__array_interface__['data'] 

注意stribes,雖然。

給定一個C-緩衝您可以通過numpy.frombuffer功能構建numpy的數組:

arr = numpy.frombuffer(buf, dtype, size, offset=0) 

(我假設你通過Python或它的C API創建新的讀寫緩衝區,比用它來存儲計算結果)

+0

好吧,我從來沒有使用過指針(因爲我不知道它們存在)。但我如何使用指針獲取C中的數組?指針只是內存位置的一個整數,只需寫一些像double array [500] =&43058432;沒有正常工作? – Petrus1904

相關問題