2014-02-28 115 views
5

跟進問題how to pass numpy array to Cython function correctly?np.ascontiguousarray,而使用用Cython np.asarray

在用Cython傳遞numpy.ndarrays當將C函數,只有具有連續陣列的交易,有沒有這樣做之間的差:

np.ndarray[double, ndim=1, mode="c"] arr = np.ascontiguousarray(np.array([1,2,3],dtype=float)) 

np.ndarray[double, ndim=1, mode="c"] arr = np.asarray(np.array([1,2,3],dtype=float), order="c") 

都是必要的嗎? np.ascontiguous暗示陣列的格式是否可以分配給一個mode=c聲明的數組?

回答

1

你應該能夠只是做:

np.ndarray[double, ndim=1, mode="c"] arr = np.array([1,2,3], dtype=np.float64, order="c") 

從文檔爲np.array

order : {'C', 'F', 'A'}, optional 
    Specify the order of the array. If order is 'C' (default), then the 
    array will be in C-contiguous order (last-index varies the 
    fastest). If order is 'F', then the returned array 
    will be in Fortran-contiguous order (first-index varies the 
    fastest). If order is 'A', then the returned array may 
    be in any order (either C-, Fortran-contiguous, or even 
    discontiguous). 

我的理解是,你只需要使用np.ascontiguousarray如果你想在陣列傳遞是從另一個陣列的一些非連續片段生成的。如果從頭開始創建數組,則不需要。

例如:

a = np.arange(10) 
a.flags['C_CONTIGUOUS'] # True 
b = a[::2] 
b.flags['C_CONTIGUOUS'] # False 

c = np.ascontiguousarray(b) 
c.flags['C_CONTIGUOUS'] # True 

而且,或許可以考慮使用typed memoryview接口

double[::1] arr = np.array([1,2,3], dtype=np.float64) 
6

docsascontiguousarray說,它會返回一個C有序陣列,所以是的,如果你使用ascontiguousarray那麼您可以假定數據是在c模式下訂購的。

然後回答兩者之間有什麼不同之處,我們可以閱讀來源。

asarraylink)做到這一點:

return array(a, dtype, copy=False, order=order) 

ascontiguousarraylink)做到這一點:

return array(a, dtype, copy=False, order='C', ndmin=1) 

因此,當你調用asarray與order='C',與ascontiguousarray唯一的區別是,你選擇ndmin的默認值,即0。這歸結爲這種差異,當你使用一個單一的數字,而不是列表中的兩種方法:

print asarray(4,dtype='float',order='c').shape 
() 
print ascontiguousarray(4,dtype='float').shape 
(1,) 

這是給你的,但我更喜歡ascontiguousarray,因爲我經常依靠加工形狀的可能性數組的屬性,並期望它是非空的。從某種意義上說,這就像是同時撥打atleast1d一樣。