首页 > 解决方案 > 是否可以通过引用将 numpy 数组传递给 cpdef 函数?

问题描述

是否可以编写一个Cython函数,其中一个numpy 数组通过引用传递(可能是内存视图?),我可以在Python中使用这样的函数吗?

我试过:

cpdef void my_function(bytes line, int& counter, np.ndarray[np.uint32_t, ndim=2]& sums):
    ...
    ...

在这里countersums将通过引用传递。我对后者感兴趣(但很乐意接受关于两者的批评和建议)。

编译器抛出:

Reference base type cannot be a Python object

我得到了相同的信息,cdef但我不了解问题的完整病因。

标签: pythonnumpycython

解决方案


是的 - 有点。

Numpy 数组是一个 Python 对象。无论如何,所有 Python 对象都是“通过引用”传递的(即,如果您在函数内部更改 Numpy 数组的内容,则在外部更改它)。

因此,您只需这样做

cpdef void my_function(bytes line, int& counter, np.ndarray[np.uint32_t, ndim=2] sums):

将其指定为 C++ 引用并没有多大意义。对于 Python 对象,Cython 隐藏了很多细节。


但是,cpdef函数设计为可从 Python 和 Cython 调用。Python 整数(和其他数字类型)是不可变的。因此,从 Python 调用时,更改counter 不会像您想象的那样起作用,并且如果它做了您希望的那样,它可能会破坏解释器。

因此,我会避免在cpdef函数中使用引用(并且可能大部分cpdef情况下完全避免使用函数 - 通常最好只决定defor cdef


推荐阅读