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

Python Cython说缓冲区类型只允许作为函数局部变量,即使对于ndarray.copy()也是如此,python,numpy,cython,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) 在编译过程中,它说缓冲区类型只允许作为函数局

我是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()
,它返回的不是memoryview,而是副本。为什么这种情况还在发生?我怎样才能避开这件事


谢谢

使用
np.ndarray[Type,dim]
在cython中定义数组时,即访问python缓冲区接口,这些不能设置为模块级变量。这是与numpy阵列数据的视图与副本不同的问题

通常,如果我想将数组作为模块级变量(即不是方法的本地变量),我会定义一个数组,然后在方法中使用类似(未测试)的内容设置它:


testarray
本身就是一个缓冲区。那么为什么不把所有的东西都放到函数中,然后从Python调用它呢?@midnight谢谢!我试图定义一些全局常量来保存几行代码。。。我以前从没想过testarray本身就是一个缓冲区。感谢您的输入-我想我会使用更详细的代码非常感谢你,乔希!这很有帮助。但是,
memoryviewslice
不会有ndarray方法,例如ndarray.mean()或ndarray.max()。。。您知道解决方法吗?只要它不会为您所做的事情带来太多的开销,您就可以使用
np.asarray
将键入的memoryview强制为使用memoryview的方法中的numpy数组。非常好!这是我没有注意到的很棒的功能。非常感谢你,乔希!为什么要使用
testarray.copy()
而不仅仅是
testarray1=testarray
?从“我正在使用
.copy()
来保证内存中有连续的数据。如果位置是Fortran连续的,这将是不必要的。”。所以我猜这里的
copy()
也是为了确保连续内存
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()