您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

用C扩展python,返回numpy数组会产生垃圾

用C扩展python,返回numpy数组会产生垃圾

尝试更改此:

static PyObject *_aux_error(PyObject *self) {

对此:

static PyObject *_aux_error(PyObject *self, PyObject *args) {

args即使您不使用它定义函数,Python也会传递该参数。

您的代码仍然存在一个基本问题。您已经使用vector堆栈上的数组创建了一个numpy数组。当_aux_error返回时,该内存将被回收并可重复使用。

您可以使用PyArray_SimpleNew()分配numpy数组的方式创建数组,然后将其复制vector到数组的数据中:

static PyObject *_aux_error(PyObject *self, PyObject *args)
{
    double vector[2] = {1.0 , 2.0};
    npy_intp dims[1] = {2};

    PyObject *ret = PyArray_SimpleNew(1, dims, NPY_DOUBLE);
    memcpy(PyArray_DATA(ret), vector, sizeof(vector));
    return ret;
}

请注意,我将类型更改为NPY_DOUBLE; NPY_FLOAT是32位浮点类型。

在一条评论中,您询问了有关在中动态分配内存的问题_aux_error。这是可能有用的示例的变体。数组的长度仍用硬编码dims,因此它不是完全通用的,但可能足以解决注释中的问题。

static PyObject *_aux_error(PyObject *self, PyObject *args)
{
    double *vector;
    npy_intp dims[1] = {5};
    npy_intp k;

    PyObject *ret = PyArray_SimpleNew(1, dims, NPY_DOUBLE);
    vector = (double *) PyArray_DATA(ret);
    /*
     *  NOTE: Treating PyArray_DATA(ret) as if it were a contiguous one-dimensional C
     *  array is safe, because we just created it with PyArray_SimpleNew, so we kNow
     *  that it is, in fact, a one-dimensional contiguous array.
     */
    for (k = 0; k < dims[0]; ++k) {
        vector[k] = 1.0 + k;
    }
    return ret;
}
python 2022/1/1 18:41:34 有268人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶