首页 文章

将numpy数组转换为cython指针

提问于
浏览
5

我有一个来自 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

    感谢您的意见 . 解决方法:

    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
    
  • 7

    更现代的方法是使用内存视图而不是指针:

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

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

    • 它可以接受任何定义缓冲区接口的类型,例如内置数组模块或PIL成像库中的对象 .

    • 可以在不保存GIL的情况下传递Memoryview,这对并行代码很有用

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

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

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

相关问题