18

我有一小部分想要使用 Cython 包装的现有 C 代码。我希望能够设置许多 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 参数。

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

4

2 回答 2

4

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

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

于 2016-02-02T14:46:25.200 回答
0

应根据此处给出的教程创建 cython 接口代码。

要获取指向 numpy 数组中数据的 C 指针,您应该使用 numpy 数组的 ctypes 属性,此处描述。

于 2010-12-21T04:00:51.203 回答