如何在 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)" 创建形状元组而不需要单独创建。)


如果您确定 arr1arr2 是数据的唯一所有者,那么您可以调用 numpy .resize method either by the normal C API function calls or the specific numpy function PyArray_Resize.