Почему при запросе формы массива NumPy внутри функции Cython я получаю 8 измерений? - PullRequest
0 голосов
/ 05 декабря 2018

У меня есть следующая функция,

%%cython  
cdef cytest(double[:,:] arr):
  return print(arr.shape)      
def pytest(arr):
  return cytest(arr)  

Я запускаю pytest со следующим массивом numpy,

dummy = np.ones((2,2))  
pytest(dummy)  

Я получаю следующий результат,

[2, 2, 0, 0, 0, 0, 0, 0]

1 Ответ

0 голосов
/ 05 декабря 2018

Это потому, что в C массивы имеют фиксированные формы.Максимальное число измерений, которое может иметь массив cython, равно 8. Cython сохраняет все измерения массива в этом массиве фиксированной длины.

Это можно проверить, выполнив следующие действия:

%%cython  
cdef cytest(double[:,:,:,:,:,:,:,:,:] arr): # works up to 8 ':'
    return arr.shape  
def pytest(arr):
    return cytest(arr)

При компиляции выдается следующее сообщение об ошибке:

Error compiling Cython file:
------------------------------------------------------------
...
cdef cytest(double[:,:,:,:,:,:,:,:,:] arr):
                  ^
------------------------------------------------------------

/path/to/_cython_magic_9a9aea2a10d5eb901ad6987411e371dd.pyx:1:19: More dimensions than the maximum number of buffer dimensions were used.

По сути, это означает, что предустановленный максимальный размер измерения равен 8, я полагаю, вы можете изменить это, изменив исходный файл cython_magic.

...