Numpy мультислайс с использованием C API? - PullRequest
1 голос
/ 13 марта 2020

Я знаю, как получить срез из массива Numpy, используя C API, следующим образом:

    // '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]

Теперь, как я могу получить "multi" срез из 'arr'? Например, как программно написать следующее выражение?

    arr[0:2,0:3]

1 Ответ

0 голосов
/ 13 марта 2020

Чтобы получить многомерные срезы, вы должны вставить срезы в кортеж, вызовите элемент get для этого кортежа. Что-то вроде:

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

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

PyObject result = PyObject_GetItem(pyArray, slices);

Основанием для этого является __getitem__(self, arg) (есть единственный аргумент), поэтому несколько индексов неявно преобразуются в кортеж: arg = (slice(0,2), slice(0,3),)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...