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 *戻り型として受け入れません。この問題を解決するにはどうすればよいですか? これを numpy 配列にラップする簡単な方法はありint *ますか (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 に答える