8

我正在尝试编写一些 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
)
4

2 回答 2

3

将类型信息放在函数的声明中,如下所示:

def hat (ndarray[np.float64_t, ndim=2] x):
    a = np.zeros((3,3));
    a[0,1] =  x[2,0];
    etc.
于 2010-12-12T16:09:53.597 回答
0

我认为你不能直接这样做:你必须检查形状并在函数中输入

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

并且仅cdeftype np.ndarray mymatrix在标题中

但是您丢失了矩阵值的输入,因此您必须将处理的每个值分配给 float64_t:但是效率应该是多少?

路易斯

于 2010-11-26T09:28:11.563 回答