为什么在cython函数中请求numpy数组的形状时,为什么会得到8个维?

时间:2018-12-05 17:42:54

标签: python cython

我具有以下功能

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

我使用以下numpy数组

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

我得到以下结果

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

1 个答案:

答案 0 :(得分:1)

这是因为在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源文件来更改它。