我正在嘗試編寫一些用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
)
你什麼意思,'而如果我刪除「[np.float64_t,NDIM = 2 ]「部分,它工作正常。」?你只是用np.ndarray [np.float64_t,ndim = 2'替換'mymatrix'發生的兩個地方? – 2010-08-07 06:02:53
我不認爲你可以使用ctypedef的緩衝接口。你必須每次使用cdef來聲明它。 – carl 2010-08-16 10:07:15