Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

return numpy array in cython defined c function

Tags:

numpy

cython

I am not sure if the following question makes sense, since I am newbie. I am trying to create in Cython a C function which returns a numpy array, like the following.

cdef np.ndarray[np.int32_t, ndim=1] SumPlusOne(np.ndarray[np.int32_t, ndim=1] ArgArray):
    cdef np.ndarray[int32_t, ndim=1] ReturnArray = np.zeros((len(ArgArray), dtype = np.int32)

    ReturnArray = ArgArray + 1

    return ReturnArray

However, is not letting me to compile it. But if I remove the return type of the function

cdef SumPlusOne(np.ndarray[np.int32_t, ndim=1] ArgArray):
    ...

There is no problem.

My question is, is there any way to declare numpy type for the return value? I don't really know if this is possible, since I don't know if np.ndarray needs to be converted to python type.

thank you

like image 799
manolius Avatar asked Feb 12 '15 10:02

manolius


1 Answers

According to cython documentation, for a cdef function:

If no type is specified for a parameter or return value, it is assumed to be a Python object.

A numpy array is a Python object. No conversion to a Python 'type' is needed. Its elements may be Python/C types (dtype), but the array as a whole is an object.

np.zeros((len(ArgArray), dtype = np.int32)

works in Python just as well as in Cython.

In my limited testing both of your cdefs work. Maybe it's a matter of cython version?

This works both with and without the type declaration after the cpdef (using this form so I can call it from Python)

import numpy as np
cimport numpy as np
cimport cython

cpdef np.ndarray[np.int32_t, ndim=1] sum_plus_one(np.ndarray[np.int32_t, ndim=1] arg):
    cdef np.ndarray[np.int32_t, ndim=1] result = np.zeros((len(arg)), dtype = np.int32)
    result = arg + 1
    return result
like image 133
hpaulj Avatar answered Sep 22 '22 00:09

hpaulj