【发布时间】:2016-11-30 09:24:10
【问题描述】:
经过长时间的努力,我成功地将一个 numpy 数组导入到 C 中,并返回一个具有相同大小的空 numpy 数组。现在我想用给定的 3x3 内核执行卷积。我习惯于创建第二个执行操作的 C 函数,而来自 python 的可调用函数只是转换输入参数以将它们传递给函数。所以我想做的是:
- 从python接收numpy数组
- 将其转换为 C-double 数组
- 执行卷积(暂时交给我)
- 将卷积数组转换回 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;
};
进一步说明,我在 Windows 8 上使用 Python 2.7。PyMODINIT_FUNC 和 PyMethodDef 已正确初始化(这意味着没有错误和正确的结果)。虽然我找到了多个结果,但它们都使用了 ctypes 或 SWIG 之类的东西,而不是 C。虽然我对 C 有点陌生,但我熟悉基础知识(来自 Arduino C)。
提前致谢!
【问题讨论】:
-
为什么不直接在python中做这一切呢?
-
@JulienBernu,因为 python 是一种“非常慢”的语言。我编写的简单比较代码导致用 C 编写的相同代码比用 python 快大约 200 倍。我想对 2592x1944 图像执行卷积,具有简单任务的巨大循环。该程序旨在执行实时图像操作。 1-2 秒只是卷积太长了
-
native python 很慢,是的(尽管并非总是如此),但 numpy 与 C 几乎相同,您不必重新发明轮子。
-
@JulienBernu,确实如此。我不得不提一下,我使用 numpy 和所有东西一样好。但我已经发现 PIL 和 opencv 库都有一个“卷积”函数(不能说这是否真的是卷积,但结果显示相同)。我的(使用 numpy 的)python 卷积花了 2.7 秒。 opencv 在 0.75 秒内完成。这很好,也许可以做得更好,但现在它很好