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

The*_*ird 5 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)
Run Code Online (Sandbox Code Playgroud)

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

curr_grid_element = (<Field *> &grid[xx, yy, zz, 0])
curr_grid_element.update()
Run Code Online (Sandbox Code Playgroud)

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

这让我很困惑,因为我认为Field是纯 C 语言。

Bi *_*ico 4

Cython扩展类型不会转换为 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
Run Code Online (Sandbox Code Playgroud)