【问题标题】:return numpy array in cython defined c function在cython定义的c函数中返回numpy数组
【发布时间】:2015-02-12 10:23:38
【问题描述】:

我不确定以下问题是否有意义,因为我是新手。 我正在尝试在 Cython 中创建一个返回 numpy 数组的 C 函数,如下所示。

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

但是,不让我编译它。但是如果我删除函数的返回类型

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

没有问题。

我的问题是,有没有办法为返回值声明 numpy 类型?我真的不知道这是否可能,因为我不知道是否需要将 np.ndarray 转换为 python 类型。

谢谢

【问题讨论】:

    标签: numpy cython


    【解决方案1】:

    根据cython 文档,对于cdef 函数:

    如果没有为参数或返回值指定类型,则假定它是 Python 对象。

    numpy array 是一个 Python 对象。不需要转换为 Python 的“类型”。它的元素可能是 Python/C 类型(dtype),但数组作为一个整体是一个对象。

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

    在 Python 中与在 Cython 中一样工作。

    在我有限的测试中,你的两个 cdef 都可以工作。可能是cython版本的问题?

    无论有没有cpdef 之后的类型声明,这都适用(使用这种形式,所以我可以从 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
    

    【讨论】:

    • 感谢您的回复。我在另一台计算机上再次尝试,它可以按照您所说的两种方式工作。我不知道这是 Cython 版本还是我之前有错字。无论如何,numpy数组结构对我来说有点混乱,所以你的解释有所帮助。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-25
    • 1970-01-01
    • 2014-09-14
    • 2019-10-30
    • 1970-01-01
    相关资源
    最近更新 更多