Python 在cython中使用numpy:定义ndarray数据类型/ndims
我正试图编写一些cython代码来使用numpy数组进行计算。Cython似乎不喜欢在我看到的所有示例中使用[]来定义数据类型和维度数 例如,我有一个文件test.pyx:Python 在cython中使用numpy:定义ndarray数据类型/ndims,python,cython,Python,Cython,我正试图编写一些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] =
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>
我认为你不能直接这么做:你必须检查函数的形状和类型
assert x.shape[0] == 2
assert x.dtype == np.float64
并且只有头中的cdeftype np.ndarray mymatrix
但是你失去了矩阵值的类型
因此,您必须将处理的每个值分配给float64\t:但效率应该是什么
Louis将类型信息放入函数声明中,如下所示:
def hat (ndarray[np.float64_t, ndim=2] x):
a = np.zeros((3,3));
a[0,1] = x[2,0];
etc.
你说的,
是什么意思?如果我删除“[np.float64\u t,ndim=2]”部分,它就可以正常工作。
?您是否只是将mymatrix
替换为np.ndarray[np.float64_t,ndim=2
中出现的两个位置?我认为您不能将缓冲区接口与ctypedef一起使用。您每次都必须使用cdef声明它。
def hat (ndarray[np.float64_t, ndim=2] x):
a = np.zeros((3,3));
a[0,1] = x[2,0];
etc.