Python 使用C API的Numpy多片?

Python 使用C API的Numpy多片?,python,numpy,numpy-ndarray,python-c-api,Python,Numpy,Numpy Ndarray,Python C Api,我知道如何使用C API从Numpy阵列获取切片,方法如下: // 'arr' is a 2D Python array, already created PyObject pyArray = PyArray_FromAny(arr, PyArray_DescrFromType(NPY_FLOAT), 0, 0, NPY_ARRAY_DEFAULT, null); PyObject slice = PySlice_New(PyLong_FromLong(0), PyLo

我知道如何使用C API从Numpy阵列获取切片,方法如下:

    // 'arr' is a 2D Python array, already created
    PyObject pyArray = PyArray_FromAny(arr, PyArray_DescrFromType(NPY_FLOAT), 0, 0, NPY_ARRAY_DEFAULT, null);

    PyObject slice = PySlice_New(PyLong_FromLong(0), PyLong_FromLong(2), null);
    PyObject result = PyObject_GetItem(pyArray, slice);
这基本上与以下Python表达式匹配:

    arr[0:2]
现在,如何从“arr”中获得“multi”切片?例如,如何以编程方式编写以下表达式

    arr[0:2,0:3]

为了获得多维切片,必须在元组中插入切片,调用该元组上的get项。比如:

PyObject* pyArray = PyArray_FromAny(arr, PyArray_DescrFromType(NPY_FLOAT), 0, 0, NPY_ARRAY_DEFAULT, null);

PyObject* slice_0 = PySlice_New(PyLong_FromLong(0), PyLong_FromLong(2), null);
PyObject* slice_1 = PySlice_New(PyLong_FromLong(0), PyLong_FromLong(3), null);
PyObject* slices = PyTuple_Pack(2, slice_0, slice_1);

PyObject* result = PyObject_GetItem(pyArray, slices);

它背后的基本原理是
\uu getitem\uuuuuuuuuuuuuu(self,arg)
(只有一个参数),因此在元组中隐式转换了多个索引:
arg=(切片(0,2),切片(0,3))

我不确定,无法测试它,但是,您可以尝试创建一个切片的元组并调用传递该元组的GetItem吗?切片创建可以使用两个元组(而不是两个整数),两个元组都包含两个整数。使用这些元组调用PyObject_GetItem会导致以下错误:TypeError:切片索引必须是整数或无或具有索引方法抱歉,但可能我不清楚:创建两个切片
PyObject切片a=PySlice_New(PyLong_FromLong(0),PyLong_FromLong(2),null)
PyObject slice\u b=PySlice\u New(PyLong\u FromLong(0),PyLong\u FromLong(3),null)
,然后创建一个元组,如
PyObject tuple=PyTuple\u Pack(2,slice\u a,slice\u b)
,然后调用
PyObject result=PyObject\u GetItem(pyArray,tuple)我的道歉。我尝试了您所说的,GetItem确实成功了,但是当我尝试使用以下命令打印结果时发生崩溃:
PyDict_SetItemString(globals,“result”,result);PyRun_SimpleStringFlags(“打印(结果,刷新=真)”,null(当我的切片为1D时,打印代码成功)这背后的基本原理是python(3)中的
\uuuu getitem\uuuuuuuuuuuuuuuuu(self,key)
具有签名
\uuuu getitem\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu(0,2),切片(0,3)))