2

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

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

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

我为它的类创建了 Cython 的东西:

cdef extern from "Narf" namespace "narf":
    cdef cppclass Narf:
        Narf() except +
        int* foo()

这些是我的 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),或者应该如何处理?

我也不确定如何在这里处理内存,因为我正在读取大文件等。

4

2 回答 2

2

要将其包装成一个 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()返回数组大小的函数。

于 2016-05-24T12:22:27.307 回答
1

这看起来可以使用这个问题的解决方案来解决:有指向数据的指针。需要 Fortran 顺序的 Numpy 数组。想用 Cython

于 2016-05-24T12:13:52.133 回答