web-dev-qa-db-ja.com

Cython:バッファタイプの不一致、「int」が必要ですが「long」になりました

この整数のメモリビューをこの(かなり些細な)関数に渡すのに問題があります。 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を使用しています。)

11
hlin117

Cythonのintタイプを使用しています。これは、Cintです。 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
13
CT Zhu

エラーメッセージに表示されたとおりに実行しました。memoryviewベースタイプをintからlongに変更しましたが、機能しているようです。

%%cython
def fun(long[:] x):
    return x[0]

y=np.array([1,2,3],dtype=int)
fun(y)    # returns 1
1
Yibo Yang

私も同じ問題を抱えていました。 Yiboの答えに動機付けられて、私は.astype(int)を使用し、問題を解決しました。

0
Nbarjest