Cython称缓冲区类型仅允许作为函数局部变量,即使对于ndarray.copy()
我刚接触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()