使用 C API 的 Numpy 多切片?

Numpy multi-slice using 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), 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);

其背后的基本原理是__getitem__(self, arg)(只有一个参数)因此多个索引在元组中隐式转换:arg = (slice(0,2), slice(0,3),)