【问题标题】:Passing Numpy arrays to C code wrapped with Cython将 Numpy 数组传递给用 Cython 包装的 C 代码
【发布时间】:2010-12-21 00:51:31
【问题描述】:

我有一小部分现有的 C 代码想要使用 Cython 进行包装。我希望能够设置许多 numpy 数组,然后将这些数组作为参数传递给 C 代码,其函数采用标准 c 数组(1d 和 2d)。我在弄清楚如何编写正确的 .pyx 代码来正确处理事情方面有点卡住了。

有一些函数,但文件 funcs.h 中的一个典型函数看起来像:

double InnerProduct(double *A, double **coords1, double **coords2, const int len)

然后我有一个 .pyx 文件,它有一个对应的行:

cdef extern from "funcs.h":
    double InnerProduct(double *A, double **coords1, double **coords2, int len)

我摆脱了 const 因为 cython 不支持它。我被卡住的地方是包装器代码应该看起来像将 MxN numpy 数组传递给 **coords1 和 **coords2 参数。

我一直在努力为此类问题找到正确的文档或教程。任何建议将不胜感激。

【问题讨论】:

标签: arrays numpy cython


【解决方案1】:

您可能想要 Cython 的“类型化内存视图”功能,您可以在 here 中详细了解该功能。这基本上是使用 numpy 或其他数组的更新、更统一的方式。这些可以在 Python 领域作为 numpy 数组公开,或者您可以将它们导出到 Python(例如,here)。你必须注意跨步是如何工作的,并确保你在例如C 连续数组与类似 FORTRAN 的数组,但文档非常清楚如何做到这一点。

如果不了解更多关于您的函数的信息,就很难更具体地确定执行此操作的最佳方法 - 即,C 函数是否对数组是只读的? (根据您给出的签名,我认为是的,但不是 100% 确定。)如果是这样,如果需要获得 C 连续状态,您不必担心制作副本,因为 C 函数不需要说话回到 Python 级别的 numpy 数组。但是键入的内存视图可以让您轻松完成任何这些操作。

【讨论】:

    【解决方案2】:

    根据here给出的教程创建cython接口代码。

    要获取指向 numpy 数组中数据的 C 指针,您应该使用 numpy 数组的 ctypes 属性,该属性在 here 中进行了描述。

    【讨论】:

    • 这不是混合了两种不同的技术(不是那一定是错误的)吗?我还没有看到任何建议在 cython 中使用 ctypes 的教程,我认为有一种方法可以在 cython 中完全处理这个问题。
    • Numpy 数组始终具有“ctypes”属性,这是一种将其数据作为 C 指针访问的安全方法。根据文档,有一些直接访问数组的“数据”属性的等效方法,请参阅docs.scipy.org/doc/numpy/reference/generated/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多