Я пишу много кода на 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 индексам таким образом?