我是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)
在编译期间,它说Buffer types only allowed as function local variables
。但是,我使用的是.copy()
或.astype()
,它不是返回内存视图,而是返回副本。为什么这仍然发生?我怎么能绕过这个?
谢谢!
答案 0 :(得分:10)
使用np.ndarray[Type, dim]
在cython中定义数组时,即访问python缓冲区接口,并且不能将它们设置为模块级变量。这是视图与numpy数组数据副本的单独问题。
通常,如果我想将一个数组作为模块级变量(即不是方法的本地),我定义一个typed memoryview,然后使用类似(未经测试)的方法在一个方法中设置它:
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()