在cythoized函数中将“int*”转换为Python或Numpy对象

2024-06-09 23:21:50 发布

您现在位置:Python中文网/ 问答频道 /正文

(我认为这个问题可以很容易地由专家回答,没有实际的复制粘贴工作的例子,所以我没有花额外的时间在它上面…)

我有一个C++方法,它返回整数数组:

int* Narf::foo() {
    int bar[10];
    for (int i = 0; i < 10; i++) {
        bar[i] = i;
    }
    return bar;
}

我为它的课程制作了Cython素材:

^{pr2}$

下面是我的Python包装:

cdef class PyNarf:
    cdef Narf c_narf
    def __cinit__(self):
        self.c_narf = Narf()
    def foo(self):
        return self.c_narf.foo()

问题在于foo方法,它的int*返回类型(我在本例中没有列出的其他方法工作得非常好!)。它不编译并给出以下错误:

    def foo(self):
        return self.c_narf.foo()
                             ^
------------------------------------------------------------

narf.pyx:39:37: Cannot convert 'int *' to Python object

当然,它显然不接受int *作为返回类型。我怎么解决这个问题?有没有一种简单的方法可以将这个int *包装成numpy数组(我更喜欢numpy),或者应该如何处理?在

我也不知道如何处理这里的内存,因为我在读大文件等等


Tags: 方法selfnumpy类型returnfoodefbar
2条回答

这看起来可以用这个问题的解决方案来解决:Have pointer to data. Need Numpy array in Fortran order. Want to use Cython

要将其包装为numpy数组,您需要知道大小,然后可以这样做:

def foo(self):
    cdef int[::1] view = <int[:self.c_narf.size()]> self.c_narf.foo()
    return np.asarray(view)

上面的代码假设存在返回数组大小的函数self.c_narf.size()。在

相关问题 更多 >