2017-07-06 5 views
0

Cythonでnumpy ndarrayをある型から他の型にキャストすると、非常に奇妙なエラーが発生します。Cythonはfloat ndarrayをint ndarrayに変換できません

とValueError:DTYPEのミスマッチをバッファし、期待される「私は非常に身近なメッセージを持っ

from convert_test import convert_to_int 
a_int=convert_to_int(np.zeros((2,2)).astype(np.float32)) 

cimport cython 
import numpy as np 
cimport numpy as np 

DTYPE = np.float32 
ctypedef np.float32_t DTYPE_t 

def convert_to_int(np.ndarray[DTYPE_t, ndim=2] float_matrix): 
    cdef np.ndarray[np.int, ndim=2] int_matrix=float_matrix.astype(np.int) 
    return int_matrix 

が、テストをコンパイルします。たとえば私は、次のconvert_test.pyxを書くときint object 'だが「long」を取得した

これはおそらく非常に明白ですが、私はまだそれを見ていません。

+0

Python 3には 'int'型がありません。それは 'long'として実装されています。ですから、 'int'ではなく' long'に変換するべきでしょう。 Cythonには経験はありませんが、動作するかどうかは言えません。 – xyres

+0

私はpython2を使用していますが、多分あなたは何かをしています。 – jean

+0

@jeanこれは私の答えを参照してくださいCythonでさまざまなタイプのmemoryviewsを作る。あなたが本当にndarrayフォーマットを望むなら、私はそれをあなたのために書くことができますが、私の2番目のサンプルと1番目のサンプルを比較するとかなり直感的です。また、単一行から整数にキャストするだけで、小数点を切り捨てる(丸めなし)ので、この関数は意図したとおりではない可能性があります。 – Matt

答えて

0

あなたはこれをやってみませんか?コンパイルとは、自分のコンピュータ上で正常に動作します:

cimport cython 
import numpy as np 
cimport numpy as np 

DTYPE = np.float32 
ctypedef np.float32_t DTYPE_t 

def convert_to_int(np.ndarray[DTYPE_t, ndim=2] float_matrix): 
    int_matrix = np.array(float_matrix, dtype=np.int32) 
    return int_matrix 

それとも、本当にmemoryviewをしたい場合:

def convert_to_int(DTYPE_t[:,:] float_matrix): 
    cdef int[:,:] int_matrix = np.array(float_matrix, dtype=np.int32) 
    return np.asarray(int_matrix) 

私はちょうどint_matrixfloat_matrixのために近代的なtyped memoryviews構文に古いndarrayパラメータを変換された第2の回答。上記のスタイルは、行列の連続したメモリ書式[:,:]です(NumPyのデフォルト値はnumpy.zerosなどです)。

あなたが投稿した関数は、小数点以下のすべてを切り捨てる(切り上げない/切り捨てる)ので、意図したとおりであることに注意してください。

0

宣言で_tタイプを使用する必要があります:cdef np.ndarray [np.int_t、ndim = 2]。

関連する問題