Обобщающий код Cython для n-мерных массивов - PullRequest
0 голосов
/ 01 ноября 2018

Я пишу много кода на Cython, который нужно обобщить до n измерений (в большинстве случаев это будет n = 1, 2 или 3).

Возьмем следующий код в качестве примера, это простая сумма элементов.

cimport cython
from cython cimport floating

cpdef floating nd_sum(floating [:, :, :] arr):
    cdef:
        Py_ssize_t [3] N = [arr.shape[0], arr.shape[1], arr.shape[2]]
        Py_ssize_t [3] i
        floating total = 0

    for i[0] in range(N[0]):
        for i[1] in range(N[1]):
            for i[2] in range(N[2]):
                total += arr[i[0], i[1], i[2]]

    return total

Концептуально обобщение на n размеров вполне очевидно. Тем не менее, я не могу реализовать это в коде. Я бы не хотел, чтобы в основном повторялся этот код для каждого случая n = 1,2,3, ...

В общем, мне также нужно иметь доступ к соседям каждого элемента массива в каждом измерении (подумайте о n -мерных извилинах ядра и т. Д.), Что делает невозможным использование таких вещей, как выравнивание массива.

Мои основные проблемы:

  • Как я могу сказать Cython ожидать массив с произвольными измерениями в качестве входных данных? Я полагаю, мне, возможно, придется прибегнуть к np.ndarray здесь ...

  • Как я могу получить элемент из n -мерного массива с массивом индексов n ?

  • Как я могу обобщить конструкцию n вложенных циклов? Здесь рекурсия кажется неизбежной, но как мне получить доступ ко всем n индексам таким образом?

...