在IPython Notebook中使用%% cython扩展名查找错误

时间:2014-05-29 01:57:36

标签: python cython ipython-notebook

有没有人知道我可以用来查找我的cython代码中的错误的方法?我正在使用IPython笔记本的cython扩展,并且当你需要使用的所有代码都是这样的时候,它开始变得烦人不得不一直在寻找错误。

ValueError                                Traceback (most recent call last)
<ipython-input-430-92c892360488> in <module>()
----> 1 knn_alg(temp, start, L, w, B)

C:\Users\Patrick\.ipython\cython\_cython_magic_3cbae3230d887da1f1bc3c64de69c379.pyd in _cython_magic_3cbae3230d887da1f1bc3c64de69c379.knn_alg (C:\Users\Patrick\.ipython\cython\_cython_magic_3cbae3230d887da1f1bc3c64de69c379.c:3333)()

C:\Users\Patrick\.ipython\cython\_cython_magic_3cbae3230d887da1f1bc3c64de69c379.pyd in _cython_magic_3cbae3230d887da1f1bc3c64de69c379.knn_alg (C:\Users\Patrick\.ipython\cython\_cython_magic_3cbae3230d887da1f1bc3c64de69c379.c:2534)()

ValueError: Buffer has wrong number of dimensions (expected 2, got 1)

我知道这意味着什么以及要寻找什么,但如果它输出一些显示错误的地方就会很好。任何帮助将不胜感激

1 个答案:

答案 0 :(得分:2)

如果没有看到更多代码,很难确定您的错误是什么。 话虽如此,看起来错误是在Cython代码之后评估的单元格的第1行。

错误的含义是您将1-D数组传递给期望2-D数组的函数。 看起来这发生在函数knn_alg内的一个函数调用中。 这是一个最小的工作示例,显示您做错了什么:

def break_things(double[:,:] a):
    pass
def break_inner_things(double[:] a):
    # Here you're passing a 1-D array to a function that expects a 2D array.
    break_things(a)

如果您需要更详细的调试消息,Cython有一个debugger。 对于像这样简单的东西,我只会找到一个仍然显示错误的小例子,然后插入print语句来验证所涉及的事物的维数。 通过上面的例子,这将是

def break_things(double[:,:] a):
    pass
def break_inner_things(double[:] a):
    print a.ndim
    break_things(a)