2010-07-31 67 views
8

我正在嘗試編寫一些用numpy數組進行計算的cython代碼。 Cython似乎不喜歡所有我見過的用於定義數據類型和維數的例子中使用的[]。在cython中使用numpy:定義ndarray數據類型/ ndims

例如,我有一個文件test.pyx:

cimport numpy as np 
import numpy as np 

ctypedef np.ndarray[np.float64_t, ndim=2] mymatrix 

cpdef mymatrix hat (mymatrix x): 
    a = np.zeros((3,3)); 
    a[0,1] = x[2,0]; 
    a[0,2] = -x[1,0]; 
    a[1,2] = x[0,0]; 
    a[1,0] = -x[2,0]; 
    a[2,0] = x[1,0]; 
    a[2,1] = -x[0,0]; 
    return a; 

我此使用setup.py(參見後結束)編譯,我與「蟒setup.py build_ext --inplace運行「

我得到以下輸出:

running build_ext 
cythoning test.pyx to test.c 

Error converting Pyrex file to C: 
------------------------------------------------------------ 
... 
cimport numpy as np 
import numpy as np 

ctypedef np.ndarray[np.float64_t, ndim=2] mymatrix 
             ^
------------------------------------------------------------ 

test.pyx:4:42: Syntax error in ctypedef statement 

<snip, irrelevant> 

而如果刪​​除了 」[np.float64_t,NDIM = 2]「 的一部分,它工作正常。

有沒有人有任何想法?

至於我的系統設置: 操作系統:Windows XP

充分,完整pythonxy安裝,版本2.6.5.1(最新的在這一點上)

pythonxy理應帶有用Cython,但我最終安裝用Cython版本0.12.1爲Python 2.6從此站點:http://www.lfd.uci.edu/~gohlke/pythonlibs/#cython

我懷疑,我不知是缺少路徑或東西:我解決了明確添加numpy的頭文件目錄由MinGW的使用的包括路徑的一些問題(見下面的setup.py文件)

這裏是setup.py文件我提到:

from distutils.core import setup 
from distutils.extension import Extension 
from distutils.sysconfig import get_python_inc 
from Cython.Distutils import build_ext 
import os.path 

inc_base = get_python_inc(plat_specific=1); 
incdir = os.path.join(get_python_inc(plat_specific=1),); 

#libraries=['math'], 
ext_modules = [Extension("test", 
["test.pyx"], 
include_dirs = [ 
    os.path.join(inc_base,'..\\Lib\\site-packages\\numpy\\core\\include\\numpy'), 
    ] 
) 
] 

setup(
    name = 'test', 
    cmdclass = {'build_ext': build_ext}, 
    ext_modules = ext_modules 
) 
+0

你什麼意思,'而如果我刪除「[np.float64_t,NDIM = 2 ]「部分,它工作正常。」?你只是用np.ndarray [np.float64_t,ndim = 2'替換'mymatrix'發生的兩個地方? – 2010-08-07 06:02:53

+1

我不認爲你可以使用ctypedef的緩衝接口。你必須每次使用cdef來聲明它。 – carl 2010-08-16 10:07:15

回答

3

放入函數的聲明類型的信息,如:

def hat (ndarray[np.float64_t, ndim=2] x): 
    a = np.zeros((3,3)); 
    a[0,1] = x[2,0]; 
    etc. 
0

我認爲你不能直接做到這一點:你必須檢查的形狀和類型的功能

assert x.shape[0] == 2 
assert x.dtype == np.float64 

只有cdeftype np.ndarray mymatrix在標題

但是你失去了矩陣值的打字 你因此必須分配你處理的每個值到float64_t:但是應該是什麼效率?

路易