嵌入Python时共享数组的最简单方法

时间:2015-12-28 08:56:41

标签: python c++ arrays numpy interop

我正在用C ++编写模拟,并决定将embedding it的某些数组的初始化委托给我的应用程序,并使用一些Python函数来生成初始数据。

由于我的2D / 3D数组是由C ++部分分配和管理的,我需要将它们传递给Python。最好的方法可能是buffer protocol。我可以用C ++编写一个Python类,它实现缓冲区协议并为我在C ++中的存储创建一个缓冲区对象。

现在,我想避免过度设计这个程序。事实上,我只需要传递一个指针,一个大小和步长的元组到Python函数。

问题是:将这些信息传递给Python例程的最简单方法是什么,然后可以使用Numpy来初始化指向的存储?

仅举一个我需要做的例子,我想从C ++调用的Python函数是:

export function selectUser(userId) {
  var user = state.users.find(item => item.id == userId);
  if (user && user.selected == false) {
    user.selected = true;
  } else {
    /* some other code */
  }
  emitChange();
}

其中def init_field(field, X, Y): field[:, :] = np.sqrt(X) + np.tanh(Y) X是由Python创建并由C ++应用程序借用的numpy数组,Y正是这个由C ++管理的2D数组。我当然可以用field替换一个或多个带有指针,大小和步幅的信息的参数,并构造numpy数组。我该怎么做?

1 个答案:

答案 0 :(得分:2)

使用PyArray_SimpleNewFromData并不太难。使用它可能会产生如下代码:

void use_array(float* ptr, int width, int height)
{
    PyObject *pFunc = pyFunction("python_function_name");
    if (pFunc == 0)
        return;
    PyObject *pArgs = PyTuple_New(1);
    npy_intp dims[2];
    dims[1] = width;
    dims[0] = height;
    PyTuple_SetItem(pArgs, 0, PyArray_SimpleNewFromData(2, dims, NPY_FLOAT, ptr));
    PyObject *pValue = PyObject_CallObject(pFunc, pArgs);
    Py_DECREF(pArgs);
    if (pValue != NULL) {
        Py_DECREF(pValue);
    }
    else 
    {
        PyErr_Print();
        fprintf(stderr,"Call failed\n");
        return;
    }
    Py_DECREF(pFunc);
}

在设置嵌入式Python环境时,您应按http://docs.scipy.org/doc/numpy-1.10.0/reference/c-api.array.html#miscellaneous

中所述调用import_array()