この整数のメモリビューをこの(かなり些細な)関数に渡すのに問題があります。 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
を投入すると、別のコンピューターで機能しますか? (私はmacbook pro retina、2013を使用しています。)
Cythonのint
タイプを使用しています。これは、C
int
です。 Mac(またはほとんどのアーキテクチャ)では、int32ビットだと思います。 wiki または intel または intのサイズはコンパイラやプロセッサに依存しますか? を参照してください。
一方、long
はint64を意味します。 dtype='int'
またはdtype=np.int
はすべてnp.int64
と同等です。
numpy
タイプの1つとして明示的に定義することもできると思います。
cimport numpy as np
import numpy as np
cdef myfunction(np.ndarray[np.int64_t, ndim=1] y):
#do something
pass
そうすれば、より明確に読み取れ、後で混乱することはありません。
[〜#〜]編集[〜#〜]
新しい memoryviews 構文は次のようになります。
cdef myfunction(double[:] y):
#do something with y
pass
エラーメッセージに表示されたとおりに実行しました。memoryview
ベースタイプをint
からlong
に変更しましたが、機能しているようです。
%%cython
def fun(long[:] x):
return x[0]
y=np.array([1,2,3],dtype=int)
fun(y) # returns 1
私も同じ問題を抱えていました。 Yiboの答えに動機付けられて、私は.astype(int)を使用し、問題を解決しました。