Я пытаюсь порта некоторые работает существующий NumPy/питон код CythonCython кортеж индексирование на п-мерный массив
Одна из проблем, я ударил в том, что я не могу использовать кортеж индексации для многомерного массива в Cython, тогда как в python/numpy он работает.
здесь просто м.в.э.:
cython_indexing.pyx
# cython: boundscheck=False
# cython: wraparound=False
def loop(int axis, double[:, :, :] a, double[:, :, :] b):
cdef:
int k, j, i
tuple q, qp1
for k in range(a.shape[0]):
for j in range(a.shape[1]):
for i in range(a.shape[2]):
q = (k, j, i)
if axis == 0:
qp1 = (k + 1, j, i)
elif axis == 1:
qp1 = (k, j + 1, i)
elif axis == 2:
qp1 = (k, j, i + 1)
# ...
# some other operations
# with heavy reuse of q, qp1
# ...
a[q] = a[q] - (b[qp1] - b[q])
test_indexing.py
import pyximport; pyximport.install()
import numpy as np
from cython_indexing import loop
a = np.arange(27).astype('float').reshape(3, 3, 3)
b = a**2
for axis in (0, 1, 2):
loop(axis, a, b)
этот пример бросает ошибку во время компиляции на b[qp1] - b[q]
:
Invalid operand types for '-' (double[:, :]; double[:, :])
есть ли какое-либо простое решение НЕ, связанное с изменением архитектуры кода?
Thanks DavidW. Также пытается индексировать memoryview с помощью скомпилированного массива фиксированного целого размера времени i.e. cdef int q [3], но он также не работает. Да, я думал об использовании новых целых чисел, но это компромисс для удобочитаемости ... Как вы думаете, второй вариант не является реалистичным вариантом. – neok