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

标签 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 语言。

最佳答案

赛通 extension types不要转化为 c 结构,它们转化为 python 内置类型。在高层次上,这意味着 Field 是一个恰好用 C 实现的 python 类,例如 listndarray。在较低级别,cython 确实使用 c 结构来实现扩展类型,但这些结构具有您没有考虑的字段。即用于跟踪其类型的字段和用于引用计数的花药(也许还有其他一些字段)。

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

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

关于python - 转换为指向 Cython 扩展类的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33745905/

相关文章:

python - Pycharm Django Debugging 真的很慢

python - Python 列表中的额外元素

python - 如何将python代码修改为cython代码?

python - GUI 表单编辑器

python - 如何调整 Plotly 图例/颜色条背景透明度/颜色

python - 在数据框的不同轴上绘制多个图形

c++ - Cython - 共享 Cython 模块

Python:检查每个用户的唯一类别

fortran - 将 Fortran 逻辑与 Cython Bint 接口(interface)的问题

python - 如何将 constexpr 暴露给 Cython?