Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在cython中使用numpy:定义ndarray数据类型/ndims_Python_Cython - Fatal编程技术网

Python 在cython中使用numpy:定义ndarray数据类型/ndims

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] =

我正试图编写一些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>

我认为你不能直接这么做:你必须检查函数的形状和类型

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.