2017-07-19 20 views
1

我无法找到任何地方的任何文档,专门用于解决此:如何使用@cython装饰声明np.ndarray型

下面的代码:

cdef int foo(double data): 
    # ... 
    return int(data) 

可以写为:

@cython.returns(cython.int) 
@cython.locals(data=cython.double) 
def foo(data): 
    return int(data) 

但我无法找到一个同等声明:

cdef foo(np.ndarray[double] data): 

使用@ cython.locals导致编译错误。

装饰者在cython中声明一个numpy数组的正确方法是什么?

+0

您可以使用记忆体吗?这些看起来像他们应该工作(例如'@ cython.locals(data = cython.double [:])')并且基本上与ndarray具有相同的功能。 (注意 - 我还没有完全测试过这个......) – DavidW

+0

@DavidW:我试过那条大道,但无法使它工作。就目前而言,你写的代码并不适合我。 (编译Cython文件时出错:test.py:31:52:不是类型) –

回答

1

这似乎并没有被记录任何地方,但memoryviews被接受为一个字符串:

@cython.returns(cython.int) 
@cython.locals(data="double[:]") 
def foo(data): 
    return int(data[0]) 

我想这通常工作,但与numpy的阵列面临的挑战是,你必须cimport numpy,我认为这是不可能的纯Python代码。

+0

您对cimport评论是正确的。我认为你在这里提出的和你在评论中提出的内容之间的区别在于你使用了字符串文字。这确实有所不同。 我打算把这个标记为答案,尽管它不完全是答案,但很可能是我们所希望的最好。 –

+0

是的,您对此和我之前的评论之间的区别以及评论中的版本不起作用是正确的。 – DavidW

0

我发现在谷歌论坛的答案如下:

试着做一个mySum功能cpdef装潢一个在.pxd 文件,使用numpy的数组声明语法cython.locals。

Google Group

您可以使用.pxd文件和@ cython.locals注解来声明 缓冲区类型。

Google Group

+0

感谢您的关注。我特别试图避免使用.pxd文件。 如果我找不到问题的解决方案,我最终不得不去那里,但这实际上并不是一个解决方案。 现在,@ cython.locals(data = np.ndarray)有效,但不能像cdef方法一样快...... –