1

我正在尝试初始化内存视图的一个切片(不是整个)。假设我有 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 数组B1B2大小为 (N,N),并尝试初始化为

A[0,:,:] = B1
A[1,:,:] = B2

这给了我以下错误:

TypeError: only length-1 arrays can be converted to Python scalars

当然,我可以将所有数据从B1和一个一个地复制B2A,但这不会有效。这个过程是一个循环,而且规模N很大。B1并以类型B2加载netcdf文件numpy.ndarray

另外,我将其定义A内存视图,以便在代码中的其他地方我可以使用nogil函数而不是访问A.

我想知道是否有一种有效的方法来如上所述初始化 memoryview,或者至少以某种方式使用 and 的指针B1并将B2它们放在一个可迭代的数组中。谢谢。

4

1 回答 1

1

我可以找到两个选项:

  1. 如果您键入B1B2作为内存视图,它会起作用。
  2. 您可以访问basememoryview 的属性以获取cvarray和索引:

    A.base[0,:,:] = B1
    A.base[1,:,:] = B2
    

    我认为这不一定适用于所有 memoryview 兼容对象(它们需要定义缓冲区接口而不是有用的__getitem__),但它应该适用于大多数对象,包括cvarray.

于 2017-07-04T17:08:27.943 回答