Passing numpy arrays in Cython to a C function that requires dynamically allocated arrays

后端 未结 2 1170
一个人的身影
一个人的身影 2020-12-06 02:50

I have some C code that has the following declaration:

int myfunc(int m, int n, const double **a, double **b, double *c);

So a

2条回答
  •  孤街浪徒
    2020-12-06 03:33

    Reply 1: You can pass NumPy array via Cython to C using the location of the start of the array (see code below).

    Reply 2: Your declarations seem correct but I don't use this approach of explicit memory management. You can use NumPy to declare cdef-ed arrays.

    Use

    cdef double[:,::1] a = np.random.random([p, q])
    cdef double[:,::1] b = np.empty([p, q])
    cdef double[::1] b = np.empty(q)
    

    Then pass &a[0], the location of the start of the array, to your C function. The ::1 is to ensure contiguousness.

    A good reference for this is Jake Vanderplas' blog: https://jakevdp.github.io/blog/2012/08/08/memoryview-benchmarks/

    Finally, typically one creates functions in Cython and calls them in Python, so your Python code would be:

    import pyximport; pyximport.install()
    import mytest
    mytest.mywrappedfunc()
    

    where mywrappedfunc is a Python (def and not cdef) function defined in the module that can do the array declaration show above.

提交回复
热议问题