【问题标题】:Return array from c++ to python将数组从 c++ 返回到 python
【发布时间】:2021-06-08 02:51:03
【问题描述】:

我想从 c++ 返回数组并在 python 代码中将其作为 numpy 数组接收。 我使用了 PyArray_SimpleNewFromData 和 Py_BuildValue 但我的程序只是退出了,没有任何错误/警告消息应该运行“PyArray_SimpleNewFromData”,所以很难理解是什么问题。

这是我返回数组的代码的一部分。

#include <Python.h>
#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION
#include "numpy\ndarraytypes.h"
#include "numpy\ndarrayobject.h"
#include "numpy\arrayobject.h"

static PyObject* cfunc(PyObject* self, PyObject* args)
{
  PyArrayObject* arr;
  double* carr;

  if (!PyArg_ParseTuple(args, "O", &arr))
  {
    return NULL;
  }

  carr = (double*)PyArray_DATA(arr);

  ...// do some job here to change the values of carr elements.

  npy_intp dims[1]; 
  dims[0] = 1; // Will be a 1D numpy array
  int length_arr = 512 * 512;
  PyObject* arr_return = PyArray_SimpleNewFromData(length_arr, dims, NPY_DOUBLE, 
  (void*)carr);

  return Py_BuildValue("O", arr_return); // Python code will receive the array as numpy array.
}

如果您有任何想法或需要更多信息,请告诉我。

【问题讨论】:

    标签: python c++ arrays numpy numpy-ndarray


    【解决方案1】:

    Read the docs(强调我的):

    PyObject* PyArray_SimpleNewFromData(int nd, npy_intp const* dims, int typenum, void* data)

    围绕给定指针指向的数据创建一个数组包装器。数组标志将默认数据区域行为良好且 C 样式连续。 数组的形状由长度为 nd 的 dims c-array 给出。 数组的数据类型由 typenum 表示。如果数据来自另一个引用计数的 Python 对象,则在传入指针后该对象的引用计数应增加,并且返回的 ndarray 的基成员应指向拥有数据的 Python 对象。这将确保在返回的数组存在时不释放提供的内存。要在释放 ndarray 后立即释放内存,请在返回的 ndarray 上设置 OWNDATA 标志。

    第一个参数nd(在您的情况下为length_arr)是维数,因此该函数将知道第二个参数dims的条目数(大多数C函数希望告诉传递给它们的数组,除非它们以某种方式终止,例如以空字符结尾的字符数组/字符串)。将dims 视为arr.shape,将nd 视为len(arr.shape)(维数)。

    在您的情况下,dims[0] 应该是 512 * 512length_arr 应该是 1。反之亦然。

    【讨论】:

    • 非常感谢您的回复!我犯了一个愚蠢的错误!我修改了它,但 PyArray_SimpleNewFromData 仍然不起作用......可能在某个地方还有另一个愚蠢的错误。我现在正在努力。再次感谢你。 :)
    • 一个调试器,或者大量的调试输出,肯定会为您的解决方案指明道路。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-06
    • 1970-01-01
    • 2019-12-05
    • 2020-07-20
    • 1970-01-01
    • 1970-01-01
    • 2012-07-08
    相关资源
    最近更新 更多