19

次のように宣言された C 関数があります。

void getIndexOfState(long *p, long C, long G, long B, long *state);

現在、私の cython ラッパー コードは、numpy 配列のバッファ構文を使用しています。

cpdef int getIndexOfState(self, np.ndarray[np.int_t, ndim=1, mode="c"] s):
    cdef long out
    getIndexOfState(&out, self.C, self.G, self.B, <long*> s.data)
    return out

新しいメモリビュー構文を使用したいのですが、質問は、メモリビューを使用するときにデータへのポインターを渡すにはどうすればよいですか?

私は試した:

cpdef int getIndexOfState(self, long[:] s):
    cdef long out
    getIndexOfState(&out, self.C, self.G, self.B, s)
    return out

モジュールをコンパイルしようとしたときに、「タイプ 'long[:]' を 'long *' に割り当てることはできません」というエラーが発生しました。C関数を呼び出す前に、メモリビューをnumpy配列に強制的に戻すことなく、そのポインタを渡す方法はありますか?

4

1 に答える 1

22

基になるデータが適切に連続しており、メモリ内に少なくとも 1 つの要素がある場合は、最初の要素 (および場合によっては長さ) へのポインターを渡すだけで十分です。

getIndexOfState(&out, self.C, self.G, self.B, &s[0])

編集:

「適切に連続」することを保証する 1 つの方法は、「[::1]」を追加することです。

cpdef int getIndexOfState(self, long[::1] s):
    cdef long out
    getIndexOfState(&out, self.C, self.G, self.B, &s[0])
    return out
于 2013-01-29T14:44:09.133 に答える