【问题标题】:convert numpy-C array to C double* [] and back将 numpy-C 数组转换为 C double* [] 并返回
【发布时间】:2016-11-30 09:24:10
【问题描述】:

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

  1. 从python接收numpy数组
  2. 将其转换为 C-double 数组
  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;
};

进一步说明,我在 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 秒内完成。这很好,也许可以做得更好,但现在它很好

标签: python c arrays numpy


【解决方案1】:

通常你可以通过调用(在python中)从numpy数组中获取一个指针:

arr.__array_interface__['data']

不过,请注意 stribes。

给定一个 c 缓冲区,您可以通过 numpy.frombuffer 函数构造 numpy 数组:

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

(我假设您通过 python 或其 C API 创建新的读写缓冲区,然后使用它来存储计算结果)

【讨论】:

  • 好吧,我从来没有想过使用指针(因为,我不知道它们存在)。但是我如何使用指针在 C 中获取数组?指针只是内存位置的整数,简单地写类似 double array[500] = &43058432;不行吗?
猜你喜欢
  • 2016-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-17
  • 1970-01-01
  • 1970-01-01
  • 2020-07-16
  • 2012-07-18
相关资源
最近更新 更多