经过长时间的努力,我成功地将一个numpy数组导入C,并返回一个空的numpy数组,返回相同的大小。现在我想用给定的3x3内核执行卷积。我习惯于创建第二个执行操作的C函数,而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)。
提前感谢!
答案 0 :(得分:0)
通常你可以通过调用(在python中)来获取numpy数组的指针:
arr.__array_interface__['data']
但要注意stribes。
给定一个c-buffer你可以通过numpy.frombuffer
函数构建numpy数组:
arr = numpy.frombuffer(buf, dtype, size, offset=0)
(我假设您通过python或其C API创建新的读写缓冲区,而不是使用它来存储计算结果)