PyArray_SimpleNewFromData在

2024-10-06 13:27:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我把一些特征矩阵转换成PyObject的:

typedef Matrix<double, Dynamic, Dynamic, RowMajor> RMatrix;

static PyObject * myfunc(PyObject * self, PyObject * args)
{
  double scalar;
  RMatrix mat_1;
  RMatrix mat_2;

  // some works

  PyObject * py_scalar = PyFloat_FromDouble(scalar);

  npy_intp size_1[2] = {(npy_intp)mat_1.rows(), (npy_intp)mat_1.cols()};
  PyObject * py_mat_1 = PyArray_SimpleNewFromData(2, size_1, NPY_DOUBLE, mat_1.data());

  npy_intp size_2[2] = {(npy_intp)mat_2.rows(), (npy_intp)mat_2.cols()};
  PyObject * py_mat_2 = PyArray_SimpleNewFromData(2, size_2, NPY_DOUBLE, mat_2.data());

  PyObject * tuple = PyTuple_New(3);
  PyTuple_SetItem(tuple, 0, py_scalar);
  PyTuple_SetItem(tuple, 1, py_mat_1);
  PyTuple_SetItem(tuple, 2, py_mat_2);
  return tuple;
}

问题是,C++中的^ {< CD1>}与Python中的^ {}不一样(同样也发生在^ {CD3>}),而其他条目则很好。在我看来,未初始化的条目,在我看来是不寻常的。原因是什么?在

更新:问题的原因应该是退出函数时内存被破坏。创建一个新数组(PyArray_FromAny)并复制数据(memcpy)解决了这个问题。在


Tags: pysizedynamicrowspyobjectscalardoublemat