17

この整数のメモリビューをこの(かなり些細な)関数に渡すのに問題があります。Pythonは私にこのエラーを与えています:

ValueError: Buffer dtype mismatch, expected 'int' but got 'long'

誰かが何が起こっているのか理解するのを手伝ってくれますか? stackoverflow を検索すると、python が型を解釈する方法と、C が型を解釈する方法に関係しているようです。

%%cython
def myfunction(int [:] y):
    pass

# Python code
import numpy as np
y = np.array([0, 0, 1, 1])
myfunction(y)

これにより、ValueError上から が生成されます。

編集:ここに私が発見した他のいくつかのものがあります。

明確にするためにy、次の方法を宣言すると、このエラーが持続します。

y = np.array([0, 0, 1, 1], dtype='int')
y = np.array([0, 0, 1, 1], dtype=np.int)
y = np.array([0, 0, 1, 1], dtype=np.int64)

ただし、次のように宣言すると機能yします

y = np.array([0, 0, 1, 1], dtype=np.int32)

なぜこれが当てはまるのか、誰かが提案したいですか?np.int32さまざまなコンピューターで動作しますか? (私は 2013 年の macbook pro Retina を使用しています。)

4

3 に答える 3

18

Cython のint型を使用していC intます。Mac (またはほとんどのアーキテクチャ) では int 32 ビットだと思います。wikiまたはintelを参照するか、int のサイズはコンパイラやプロセッサに依存しますか?

一方、longは int64 を意味します。dtype='int'またはdtype=np.intすべてと同等np.int64です。

numpy次のタイプのいずれかとして明示的に定義するだけでよいと思います。

cimport numpy as np
import numpy as np
cdef myfunction(np.ndarray[np.int64_t, ndim=1] y):
     #do something
     pass

そうすれば、読みやすくなり、後で混乱することはありません。

編集

新しいメモリビューの構文は次のようになります。

cdef myfunction(double[:] y):
    #do something with y
    pass
于 2015-08-28T04:34:46.660 に答える