尝试将自定义 C++ 矩阵传递给 numpy 数组

Posted

技术标签:

【中文标题】尝试将自定义 C++ 矩阵传递给 numpy 数组【英文标题】:Trying to pass a custom C++ matrix to a numpy array 【发布时间】:2016-11-14 10:11:39 【问题描述】:

我正在尝试做一些 Python 包装来使用自定义 C++ 的东西。我们使用的主要类型是 2D 灰度图像类型,数据分配在 1D 缓冲区中。我尝试以这种方式包装它(以下示例in an ubuntu forum):

PyObject* to_python_object(const custom2DImage& img) 
  int type_num = (int)NPY_UBYTE;
  long int dims[2] = img.nr(), img.nc();

  uchar** tmp_img = new uchar*[img.nr()];
  tmp_img[0] = new uchar[img.nr() * img.nc()];
  for (int i = 1; i < img.nr(); ++i)
    tmp_img[i] = tmp_img[0] + img.nc();
  for (int i = 0; i < img.nc(); ++i)
    memcpy(tmp_mat[i], &img(i, 0), img.nc() * sizeof(uchar));
  PyObject* py_img = PyArray_SimpleNewFromData(2, dims, type_num, tmp_img[0]);

  Py_INCREF(py_img);
  delete[] tmp_img[0];
  delete[] tmp_img;

  PyObject *repr = PyObject_Repr(py_img);
  const char *s = PyString_AsString(repr);
  cout << s << endl;
  Py_XDECREF(repr);

  return py_img;

我的 C++ 函数中的 Python 对象表示是好的,但是一旦我尝试在我的 python 主程序中打印它,它就会出现段错误(即使形状很好)。 Python代码如下:

img = cst.read_image(filename);
if img is None:
    print("Can not load image from", filename)
    sys.exit(-1)
print(img)

你知道我为什么会遇到这个问题吗?

【问题讨论】:

【参考方案1】:

好的,我认为PyArray_SimpleNewFromData 函数正在复制数据,但似乎不是。我的错误是释放tmp_img 2D 数组。

【讨论】:

以上是关于尝试将自定义 C++ 矩阵传递给 numpy 数组的主要内容,如果未能解决你的问题,请参考以下文章

如何将自定义结构传递给 C++(非 CLI)中的 _variant_t?

将 numpy 数组传递给 c++ 函数并返回 numpy 数组作为输出的最有效方法是啥?

如何通过 cython 将 numpy 数组列表传递给 c++

如何将自定义类型数组传递给 Postgres 函数

使用 SWIG 将 numpy 数组元素(int)传递给 c++ int

将 2d numpy 数组传递给 C++ 时出现 TypeError