将Numpy数组传递给用Cython包装的C代码

时间:2010-12-21 00:51:31

标签: arrays numpy cython

我有一小部分现有的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参数。

我一直在努力为这类问题找到正确的文档或教程。任何建议都将非常受欢迎。

2 个答案:

答案 0 :(得分:2)

你可能想要Cython"键入内存视图"功能,您可以在完整的血腥细节here中阅读。这基本上是使用numpy或其他数组的更新,更统一的方法。这些可以在Python-land中作为numpy数组公开,或者可以将它们导出到Python(例如,here)。你必须注意跨步的工作方式,并确保你对此有所了解。 C-contiguous与FORTRAN类似的数组,但文档非常清楚如何做到这一点。

在不了解更多关于你的功能的情况下,很难在更好的方法上更加具体 - 即,C函数是否只读数组? (我认为是的,基于你给出的签名,但我不是100%肯定。)如果是这样你不需要担心如果需要制作副本以获得C连续状态,因为C函数没有'我需要回到Python级别的numpy数组。但是输入内存视图可以让你轻松完成任何这些操作。

答案 1 :(得分:0)

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

要获取一个指向numpy数组中数据的C指针,您应该使用numpy数组的ctypes属性,该属性描述为here