如何在 C++ 中调整和减去 numpy 数组
how to resize and subtract numpy arrays in c++
我在 python 中有两个高度和宽度不同的 numpy 3D 数组。我想将它们传递给我的 C-Extension。如何在 C++ 中调整大小和减去它们?请看代码中的注释。
static PyObject *my_func(PyObject *self, PyObject *args)
{
Py_Initialize();
import_array();
PyObject *arr1;
PyObject *arr2;
if(!PyArg_ParseTuple(args, "OO", &arr1, &arr2))
{
return NULL;
}
//How can I do this?
//resize arr1 to [100, 100, 3]
//resize arr2 to [100, 100, 3]
//res = arr1 - arr2
//return res
}
首先制作所需的形状。作为元组比列表更容易做到这一点:
PyObject* shape = Py_BuildValue("iii",100,100,3);
检查是否为 NULL 以确保发生错误并处理如果有。
您可以在两个数组上调用 numpy resize
function 来调整它们的大小。除非您确定数据未共享,否则您需要调用 numpy.resize
而不是数组的 .resize
方法。这涉及导入模块并获取调整大小属性:
PyObject* np = PyImport_ImportModule("numpy");
PyObject* resize = PyObject_GetAttrString(np,"resize");
PyObject* resize_result = PyObject_CallFunctionObjArgs(resize,arr1, shape,NULL);
我省略了所有错误检查,你应该在每个阶段之后进行。
当您不再需要它们时,确保减少各种 PyObject
的引用计数。
使用 PyNumber_Subtract
进行减法(对 resize
的结果进行减法)。
补充:调用调整大小的快捷方式应该避免大多数中间体:
PyObject* np = PyImport_ImportModule("numpy");
// error check against null
PyObject* resize_result = PyObject_CallMethod(np,"resize","O(iii)",arr1,100,100,3);
("(iii)"
创建形状元组而不需要单独创建。)
如果您确定 arr1
和 arr2
是数据的唯一所有者,那么您可以调用 numpy .resize
method either by the normal C API function calls or the specific numpy function PyArray_Resize
.
我在 python 中有两个高度和宽度不同的 numpy 3D 数组。我想将它们传递给我的 C-Extension。如何在 C++ 中调整大小和减去它们?请看代码中的注释。
static PyObject *my_func(PyObject *self, PyObject *args)
{
Py_Initialize();
import_array();
PyObject *arr1;
PyObject *arr2;
if(!PyArg_ParseTuple(args, "OO", &arr1, &arr2))
{
return NULL;
}
//How can I do this?
//resize arr1 to [100, 100, 3]
//resize arr2 to [100, 100, 3]
//res = arr1 - arr2
//return res
}
首先制作所需的形状。作为元组比列表更容易做到这一点:
PyObject* shape = Py_BuildValue("iii",100,100,3);
检查是否为 NULL 以确保发生错误并处理如果有。
您可以在两个数组上调用 numpy resize
function 来调整它们的大小。除非您确定数据未共享,否则您需要调用 numpy.resize
而不是数组的 .resize
方法。这涉及导入模块并获取调整大小属性:
PyObject* np = PyImport_ImportModule("numpy");
PyObject* resize = PyObject_GetAttrString(np,"resize");
PyObject* resize_result = PyObject_CallFunctionObjArgs(resize,arr1, shape,NULL);
我省略了所有错误检查,你应该在每个阶段之后进行。
当您不再需要它们时,确保减少各种 PyObject
的引用计数。
使用 PyNumber_Subtract
进行减法(对 resize
的结果进行减法)。
补充:调用调整大小的快捷方式应该避免大多数中间体:
PyObject* np = PyImport_ImportModule("numpy");
// error check against null
PyObject* resize_result = PyObject_CallMethod(np,"resize","O(iii)",arr1,100,100,3);
("(iii)"
创建形状元组而不需要单独创建。)
如果您确定 arr1
和 arr2
是数据的唯一所有者,那么您可以调用 numpy .resize
method either by the normal C API function calls or the specific numpy function PyArray_Resize
.