【发布时间】:2017-07-07 10:08:29
【问题描述】:
我正在尝试将我的一些 Python 代码转换为 Cython,但在尝试将函数定义为 cdef 时遇到了一些问题。
大部分问题归结为掩码无法像在 Python 中那样工作。我想知道这是否是cdef 的限制(如果我将其保留为def,则可以正常工作)或者是否有什么我可以做的。
比如这个方法
cdef func(double[:,:,:,:] arg1):
mask = arg1 > 0
...
已经因编译错误而失败:
Error compiling Cython file:
------------------------------------------------------------ ...
func (double[:,:,:,:] arg1):
mask = arg1 > 0
^
------------------------------------------------------------
cythonfile.pyx:43:20: Invalid types for '>' (double[:, :, :, :], long)
【问题讨论】:
-
你不应该定义
cdef func(np.ndarray[np.float_t, ndim=4] arg1)吗?0也是long integer。将其替换为0.以获得float。 -
@NilsWerner:我刚刚尝试并更改了类型,这似乎可以做到。我之前有
double[:,:]工作的代码,所以从没想过,但是对于那个代码,我没有使用掩码。我想需要告诉 cython 这是一个允许屏蔽的 numpy 数组。谢谢! -
我猜
double[:, :]只允许对元素进行单独寻址,但不能像您正在做的那样进行矢量化操作。 -
是的,我也这么认为。我以前从未在 Cython 中使用过矢量化操作。