将numpy数组转换为cython指针

时间:2012-05-23 11:07:09

标签: python numpy cython

我有一个来自cv2.imread的numpy数组,因此有dtype = np.uint8ndim = 3

我想将其转换为Cython unsigned int*,以便与外部cpp库一起使用。

我正在尝试cdef unsigned int* buff = <unsigned int*>im.data但是我收到错误Python objects cannot be cast to pointers of primitive types

我做错了什么?

由于

2 个答案:

答案 0 :(得分:7)

感谢您的评论。解决方法:

cdef np.ndarray[np.uint32_t, ndim=3, mode = 'c'] np_buff = np.ascontiguousarray(im, dtype = np.uint32)
cdef unsigned int* im_buff = <unsigned int*> np_buff.data

答案 1 :(得分:0)

更现代的方式是使用memoryview而不是指针:

cdef np.uint32_t[:,:,::1] mv_buff = np.ascontiguousarray(im, dtype = np.uint32)

[:,;,::1]语法告诉Cython,内存视图在内存中是3D和C连续的。将类型定义为memoryview而不是numpy数组的优点是

  1. 它可以接受任何定义缓冲区接口的类型,例如内置阵列模块或PIL映像库中的对象。
  2. 可以在不保留GIL的情况下传递内存视图,这对于并行代码很有用

要从memoryview获取指针,请获取第一个元素的地址:

cdef np.uint32_t* im_buff = &mv_buff[0,0,0]

这比做<np.uint32_t*>mv_buff.data更好,因为它避免了强制类型转换,并且强制类型转换通常可以隐藏错误。