在Cython中使用类型化的内存视图返回numpy友好数组的正确方法?

 国芝翰娥264 发布于 2023-01-20 15:45

我试图使用Cython内存视图而不创建或使用numpy数组,所以我从来不必编译numpy,但我想返回Python端可以"转换"为numpy数组的东西.例如,我有这个函数,它接受一个2D数组并返回一个新的1d数组:

cimport cython
from cython.view cimport array as cvarray

cpdef int[:] myfunc(int[:,:] input_arr, int arr_len):
   cdef int i
   # allocate new int array
   cdef int[:] new_arr = cvarray(shape=(arr_len,), itemsize=sizeof(int), format="i") 
   for i in xrange(arr_len):
      if input_arr[i, 0] == 1:
         new_arr[i] = 0
      else:
         new_arr[i] = 1
   return new_arr

现在从Python我实际上想要将一个numpy数组传递给该函数并将结果视为一个numpy数组:

# From Python
import numpy as np
data = np.array([[0,0,0],[1,0,1]], dtype=np.dtype("i"))
result = myfunc(data, data.shape[0])
# How do I make 'result' accessible as numpy array here??
# ...
result = np.array(result)  # one possibility

怎么办?我的方式是否正确?更具体的问题:

    引用new_arr[x]会回到Python吗?我希望它是数组的纯C索引

    有没有之间的差异cdef int[:] new_arr = ...cdef int[::1] new_arr = ...?我不明白后者

    这是cvarray分配内存的最佳方式,还是clone?使用numpy数组我会np.empty尝试在这里获得有效的东西.此外,为什么format="i"需要cvarray通话.

    最后,如果clone是正确的语法,它如何用于2d数组?目前还不清楚https://github.com/cython/cython/blob/f94ad59754a0f0b1cef4a334b988a21392a738c0/Cython/Includes/cpython/array.pxd

这与这篇文章有关(为类型化的内存视图分配内存的推荐方法是什么?),我并不完全理解.

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有