經過漫長的鬥爭之後,我設法成功地將一個numpy數組導入到C中,並返回一個具有相同大小的空numpy數組。現在我想對給定的3x3內核執行卷積。我用來創建第二個執行操作的C函數,而來自python的可調用函數只是將輸入參數轉換爲將它們傳遞給函數。所以我希望做的是:將numpy-C數組轉換爲C double * []並返回
- 從蟒蛇收到numpy的陣列
- 將其轉換爲C-雙陣列
- 進行卷積(離開這個我現在)
- 轉換將複數數組返回到C-numpy數組
- 將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)。
在此先感謝!
爲什麼不直接在python中做這一切? – Julien
@JulienBernu,因爲python是一個'非常緩慢'的語言。我寫的簡單比較代碼導致用C寫的相同代碼比python快大約200倍。我想在2592x1944圖像上進行卷積,用簡單的任務完成巨大的循環。該程序旨在執行實時圖像操作。 1-2秒只是卷積太長 – Petrus1904
原生python速度慢,是的(雖然不是總是),但numpy與C幾乎相同,並且不必重新發明輪子。 – Julien