Cython说缓冲区类型只允许作为函数局部变量,即使对于ndarray.copy()也是如此

Yux*_*ang 7 python numpy cython

我是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)
Run Code Online (Sandbox Code Playgroud)

在汇编期间,它说Buffer types only allowed as function local variables.但是,我正在使用.copy().astype()返回的不是内存视图,而是副本.为什么这仍然发生?我怎么能绕过这个?

谢谢!

Jos*_*del 10

当您在cython中使用定义数组时np.ndarray[Type, dim],即访问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()
Run Code Online (Sandbox Code Playgroud)