我正在尝试编写一些cython代码来进行numpy数组的计算。 Cython似乎不喜欢我见过的所有示例中使用的[]来定义数据类型和维数。
例如,我有一个文件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编译它(参见结尾),我使用“python 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,但我最终从这个网站安装了Python 2.6的cython版本0.12.1: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 :(得分:3)
将类型信息放在函数的声明中,如:
def hat (ndarray[np.float64_t, ndim=2] x):
a = np.zeros((3,3));
a[0,1] = x[2,0];
etc.
答案 1 :(得分:0)
我认为你不能直接这样做:你必须检查形状并输入函数
assert x.shape[0] == 2
assert x.dtype == np.float64
并且标题中只有cdeftype np.ndarray mymatrix
但是你丢失了矩阵值的输入 因此,您必须将您处理的每个值分配给float64_t:但效率应该是多少?
路易斯