【python开发技术】Cython 开发学习之np.ndarray与memoryviews

Cython 开发学习之np.ndarray与memoryviews

Posted by ZhangPY on April 9, 2020

【python开发技术】Cython 开发学习之np.ndarray与memoryviews

问题描述

Cython中常用的np.ndarray只能作为函数的local局部变量定义,而不能作为global,比如cdef class类的成员变量来管理。

# [Error]: Buffer types only allowed as function local variables
cdef class Seg:
    DTYPE = np.float32
    ctypedef np.float32_t DTYPE_t
    cdef np.ndarray[DTYPE_t] delay_buffer # np.ndarray

解决方法

此时,需要定义类成员变量为memoryview才可以实现。

# [right]
cdef class Seg:
    DTYPE = np.float32
    ctypedef np.float32_t DTYPE_t
    cdef DTYPE_t[:] delay_buffer # memoryviews

np.ndarray与memoryviews之间的相互转化

此时,需要使用np的函数进行调用,需要将memoryviews转成np.ndarray进行处理。操作的时候直接调用np.asarray()即可。

而np.ndarray是可以直接赋值给相同形状的 memoryviews

cdef np.uint8_t[:,:,:] outputMask
self.outputMask = np.zeros_like(self.images)

np.asarray与np.array的区别和注意

这两者的区别是,对于一个Image.open打开的图像,如果直接使用np.asarray得到的array是一个read_only的buffer,而使用np.array则会是一个新的。原因是asarray用的还是原来的数据buffer,而array则会新建一个buffer。

此时对于一个read_only的array,如果给其赋值则会报错。


2020-04-09