我试图使用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
这与这篇文章有关(为类型化的内存视图分配内存的推荐方法是什么?),我并不完全理解.