2015-03-13 93 views
4
cpdef myf(): 
    # pd has to be a c array. 
    # Because it will then be consumed by some c function. 
    cdef double pd[8000] 
    # Do something with pd 
    ... 
    # Get a memoryview. 
    cdef double[:] pd_view = pd 
    # Coercion the memoryview to numpy array. Not working. 
    ret = np.asarray(pd) 
    return ret 

我希望它返回一個numpy數組。我該怎麼做?如何在cython中暴露c數組中的numpy數組?

目前我必須做

pd_np = np.zeros(8000, dtype=np.double) 
cdef int i 
for i in range(8000): 
    pd_np[i] = pd[i] 

回答

1

我做了一個錯字, ret = np.asarray(pd_view)工作

1

memview示例這裏http://docs.cython.org/src/userguide/memoryviews.html

# Memoryview on a C array 
cdef int carr[3][3][3] 
cdef int [:, :, :] carr_view = carr 
carr_view[...] = narr_view # np.arange(27, dtype=np.dtype("i")).reshape((3, 3, 3)) 
carr_view[0, 0, 0] = 100 

我可以從carr_view創建numpy的陣列,上carr,C數組的存儲器圖。

# print np.array(carr) # cython error 
print 'numpy array on carr_view' 
print np.array(carr_view) 
print np.array(carr_view).sum() # match sum3d(carr) 
# or np.asarray(carr_view) 


print 'numpy copy from carr_view' 
carr_copy = np.empty((3,3,3)) 
carr_copy[...] = carr_view[...] # don't need indexed copy 
print carr_copy 
print carr_copy.sum() # match sum3d(carr) 
3

如果你只是聲明你在你的函數數組,當你需要C數組你可以獲取數據指針爲什麼不把它numpy的數組開始,然後。

cimport numpy as np 
import numpy as np 

def myf(): 
    cdef np.ndarray[double, ndim=1, mode="c"] pd_numpy = np.empty(8000) 
    cdef double *pd = &pd_numpy[0] 

    # Do something to fill pd with values 
    for i in range(8000): 
     pd[i] = i 

    return pd_numpy