转换为指向Cython扩展类的指针

时间:2015-11-16 22:34:11

标签: python cython

我是Cython的新手所以请耐心等待。我正在尝试将一些数据转换为指向扩展类的指针。这个类本质上是一个美化的结构。它在我的.pxd文件中声明为:

cdef class Field:

    cdef:
        np.float64_t u                   # x velocity
        np.float64_t v                   # y velocity
        np.float64_t w                   # z velocity

    cdef update(self)

当然,这是在.pyx文件中实现的。在我的驱动程序代码中,我有一个np.float64_t的4维数组。前三个维度代表x,y和z。第四维应该代表这三个值u, v, w。我在纯Python驱动程序中分配网格,然后将网格传递给Cython文件。在Cython文件中,我演员:

curr_grid_element = (<Field *> &grid[xx, yy, zz, 0])
curr_grid_element.update()

但是当我这样做时,我收到错误:Pointer base type cannot be a Python object

让我感到困惑的是,我认为Field是纯粹的C.

1 个答案:

答案 0 :(得分:3)

Cython extension types不会转换为c结构,它们会转换为内置类型的python。在高级别,这意味着Field是一个python类,恰好在C中实现,例如listndarray。在较低级别,cython确实使用c结构来实现扩展类型,但这些结构具有您不考虑的字段。即用于跟踪其类型的字段和用于引用计数的另一个字段(也可能是其他一些字段)。

我认为你想要的是结构,而不是扩展类型。试试这个:

cdef struct Field:
    np.float64_t u                   # x velocity
    np.float64_t v                   # y velocity
    np.float64_t w                   # z velocity