Cython称缓冲区类型仅允许作为函数局部变量,即使对于ndarray.copy()

14 投票
1 回答
5717 浏览
提问于 2025-04-18 07:26

我刚接触Cython,看到了一段代码:

import numpy as np
cimport numpy as np

testarray = np.arange(5)
cdef np.ndarray[np.int_t, ndim=1] testarray1 = testarray.copy()
cdef np.ndarray[np.float_t, ndim=1] testarray2 = testarray.astype(np.float)

在编译的时候,它提示说 只允许在函数内部使用缓冲区类型的变量。可是,我使用了 .copy().astype(),这些方法返回的不是内存视图,而是一个副本。为什么还会出现这个问题呢?我该怎么解决呢?

谢谢!

1 个回答

17

在Cython中,当你用 np.ndarray[类型, 维度] 来定义一个数组时,这实际上是在使用Python的缓冲区接口,而这种方式不能作为模块级别的变量。这和NumPy数组数据的视图与拷贝是两个不同的问题。

通常,如果我想把一个数组作为模块级别的变量(也就是说,不局限于某个方法内部),我会定义一个类型化内存视图,然后在某个方法中用类似下面的方式来设置它(这个代码没有测试过):

import numpy as np
cimport numpy as np

cdef np.int_t[:] testarray1

def init_arrays(np.int_t[:] testarray):
    global testarray1
    testarray1 = testarray.copy()

撰写回答