将numpy-C数组转换为C double * []并返回

时间:2016-11-30 09:24:10

标签: python c arrays numpy

经过长时间的努力,我成功地将一个numpy数组导入C,并返回一个空的numpy数组,返回相同的大小。现在我想用给定的3x3内核执行卷积。我习惯于创建第二个执行操作的C函数,而python中的可调用函数只是转换输入参数以将它们传递给函数。所以我想做的是:

  1. 从python
  2. 接收numpy数组
  3. 将其转换为C-double数组
  4. 执行卷积(暂时留给我)
  5. 将回旋数组转换回C-numpy数组
  6. 将C-numpy数组返回给python。
  7. 所以第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)。

    提前感谢!

1 个答案:

答案 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创建新的读写缓冲区,而不是使用它来存储计算结果)