嵌入时共享数组的最简单方法 Python
Simplest way to share an array when embedding Python
我正在用 C++ 编写模拟,并决定通过 embedding it 将一些数组的初始化委托给 Python 到我的应用程序中,并使用一些 Python 函数来生成初始数据。
由于我的 2D/3D 数组是由 C++ 部分分配和管理的,因此我需要将它们传递给 Python。最好的方法可能是buffer protocol。我可以用 C++ 编写一个 Python class,它实现了缓冲区协议并为我在 C++ 中的存储创建了一个缓冲区对象。
现在,我想避免过度设计这个过程。事实上,我只需要将一个指针、一个大小和步长的元组传递给一个 Python 函数。
因此问题是:将此信息传递给 Python 例程的最简单方法是什么,然后例程可以使用它(可能与 Numpy 一起)来初始化指向的存储?
举个例子说明我需要做什么,我想从 C++ 调用的 Python 函数是:
def init_field(field, X, Y):
field[:, :] = np.sqrt(X) + np.tanh(Y)
其中 X
和 Y
是由 Python 创建并由 C++ 应用程序借用的 numpy 数组, field
正是这个由C++。我当然可以将 field
替换为一个或多个携带有关指针、大小和步幅信息的参数,并构建 numpy 数组。我该怎么做?
使用 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()
我正在用 C++ 编写模拟,并决定通过 embedding it 将一些数组的初始化委托给 Python 到我的应用程序中,并使用一些 Python 函数来生成初始数据。
由于我的 2D/3D 数组是由 C++ 部分分配和管理的,因此我需要将它们传递给 Python。最好的方法可能是buffer protocol。我可以用 C++ 编写一个 Python class,它实现了缓冲区协议并为我在 C++ 中的存储创建了一个缓冲区对象。
现在,我想避免过度设计这个过程。事实上,我只需要将一个指针、一个大小和步长的元组传递给一个 Python 函数。
因此问题是:将此信息传递给 Python 例程的最简单方法是什么,然后例程可以使用它(可能与 Numpy 一起)来初始化指向的存储?
举个例子说明我需要做什么,我想从 C++ 调用的 Python 函数是:
def init_field(field, X, Y):
field[:, :] = np.sqrt(X) + np.tanh(Y)
其中 X
和 Y
是由 Python 创建并由 C++ 应用程序借用的 numpy 数组, field
正是这个由C++。我当然可以将 field
替换为一个或多个携带有关指针、大小和步幅信息的参数,并构建 numpy 数组。我该怎么做?
使用 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()