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

19

我有一小段现有的 C 代码,我想使用 Cython 进行包装。我想设置一些 numpy 数组,然后将这些数组作为参数传递给函数,这些函数接受标准的 C 数组(1维和2维)。在编写合适的 .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参数。

我一直在寻找正确的文档或教程来解决这种类型的问题。 任何建议都将不胜感激。


可能是使用Cython简单包装C代码的重复问题 - Padraic Cunningham
我有一篇Cython帖子,你可能能够提供见解。 - ballade4op52
2个回答

4
您可能需要使用Cython的“类型化内存视图”功能,您可以在此处详细了解http://docs.cython.org/src/userguide/memoryviews.html。这基本上是使用numpy或其他数组的更新、更统一的方法。这些可以作为numpy数组在Python中使用,或者您可以将它们导出到Python中(例如,在此处http://docs.cython.org/src/userguide/memoryviews.html#cython-arrays)。您必须注意步幅如何工作,并确保您对例如C连续 vs. FORTRAN-like数组保持一致,但文档非常清楚地说明了如何做到这一点。
不知道您的函数更多信息很难更具体地确定最佳方法 - 即,C函数是否只读取数组?(根据您给出的签名,我认为是的,但不能百分之百确定。)如果是,则无需担心复制是否需要获取C连续状态,因为C函数不需要与Python级别的numpy数组交互。但是,类型化内存视图将让您以最少的麻烦完成所有这些操作。

0

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

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


这不是在混合两种不同的技术吗(虽然这并不一定是错误的)?我没有看到任何建议使用ctypes和cython结合的教程,我会认为完全可以在cython中处理这个问题。 - JoshAdel
Numpy数组始终具有“ctypes”属性,这是一种安全访问其数据作为C指针的方式。根据文档,还有一些等效的直接访问数组的“data”属性的方法,请参见http://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.ctypes.html#numpy-ndarray-ctypes。 - DaveP

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接