9

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

1 Answer 1

10

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
Sign up to request clarification or add additional context in comments.

1 Comment

thank you for replying. I tried again in a different computer, and it is working both ways as you said. I don't know if it is the Cython version or that I had a typo before. Anyway, numpy arrays structure are a little confusing for me, so your explanation helped. Thank you

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.