我正在尝试初始化内存视图的一个切片(不是整个)。假设我有 memoryviewA作为类的属性(扩展类型)
from cython.view cimport array as cvarray
N = 1000
cdef double[:,:,::1] A = cvarray(shape=(2,N,N),itemsize=sizeof(double),format='d')
现在,我试图在一个cdef函数中初始化它。我像这样初始化整个内存视图没有问题
# From elsewhere we have loaded a numpy.ndarray B of size (2,N,N)
A[:,:,:] = B
当初始化器B是 3D 数组时这很好,(2,N,N)这样我们就不必切片 A了。但是现在,问题就在这里:假设我有 2D 数组B1,B2大小为 (N,N),并尝试初始化为
A[0,:,:] = B1
A[1,:,:] = B2
这给了我以下错误:
TypeError: only length-1 arrays can be converted to Python scalars
当然,我可以将所有数据从B1和一个一个地复制B2到A,但这不会有效。这个过程是一个循环,而且规模N很大。B1并以类型B2加载netcdf文件numpy.ndarray。
另外,我将其定义A为内存视图,以便在代码中的其他地方我可以使用nogil函数而不是访问A.
我想知道是否有一种有效的方法来如上所述初始化 memoryview,或者至少以某种方式使用 and 的指针B1并将B2它们放在一个可迭代的数组中。谢谢。