2012-02-28 23 views
5

私は64ビット符号付き整数のpython型intの行列を構築しようとしています。配列のcython/numpy型

cdef matrix33(): 
    return np.zeros((3,3),dtype=int) 

cdef do_stuf(np.ndarray[int, ndim=2] matrix): 
    ... 
    return some_value 

def start(): 
    print do_stuf(matrix33()) 

それは右のコンパイルが、私はそれを実行したとき、私はこのエラーを取得しておいてください。

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

私はpythonの長いのでは動作しないことができますが、私は適切に64に変換する方法がわかりませんint。

UPDATE

オーケー。私はCythonを正しく使用していると確信しています。私が書いたコードは、go/atariをキャプチャするゲームのminmax検索用でした。

圧倒的に呼び出される関数はこれらです:

cdef isThere_greedy_move(np.ndarray[np.int64_t, ndim=2]board, int player): 
    cdef int i, j 
    for i in xrange(len(board)): 
     for j in xrange(len(board)): 
      if board[i,j] == 0: 
       board[i,j] = player 
       if player in score(board): 
        board[i,j] = 0 
        return True 
       board[i,j] = 0 
    return False 


# main function of the scoring system. 
# returns list of players that eat a stone 
cdef score(np.ndarray[np.int64_t, ndim=2] board): 
    scores = [] 
    cdef int i,j 
    cdef np.ndarray[np.int64_t, ndim = 2] checked 
    checked = np.zeros((board.shape[0], board.shape[1]), dtype = int) 
    for i in xrange(len(board)): 
     for j in xrange(len(board)): 
      if checked[i,j] == 0 and board[i,j] !=0: 
       life, newly_checked = check_life(i,j,board,[]) 
       if not life: 
        if -board[i,j] not in scores: 
         scores.append(-board[i,j]) 
         if len(scores) == 2: 
          return scores 
       checked = update_checked(checked, newly_checked) 
    return scores 

# helper functions of score/1 
cdef check_life(int i, int j, np.ndarray[np.int64_t, ndim=2] board, checked): 
    checked.append((i,j)) 
    if liberty(i,j,board): 
     return True, checked 
    for pos in [[1,0],[0,1],[-1,0],[0,-1]]: 
     pos = np.array([i,j]) + np.array(pos) 
     if check_index(pos[0],pos[1],len(board)) and board[pos[0],pos[1]] == board[i,j] and (pos[0],pos[1]) not in checked: 
      life, newly_checked = check_life(pos[0],pos[1],board,checked) 
      if life: 
       checked = checked + newly_checked    
       return life, checked 
    return False, [] # [] is a dummy. 

cdef liberty(int i,int j, np.ndarray[np.int64_t, ndim=2] board): 
    for pos in [np.array([1,0]),np.array([0,1]),np.array([-1,0]),np.array([0,-1])]: 
     pos = np.array([i,j]) - pos 
     if check_index(pos[0],pos[1],len(board)) and board[pos[0],pos[1]] == 0: 
      return True 
    return False 

私は本当にこれがcythonのために輝くチャンスだろうと思っているだろう。それはどちらも、Pythonのtimeモジュールで今すぐ°

60℃未満のi7プロセッサー上で試験した一貫2.03 あるcythonで、

のPython 2.7は、一貫性のある2.28秒の処理を行います。 は3x3のキャプチャが行く解決するために、私は

答えて

6

CythonのintタイプはC int、すなわち通常(必ずしも必要ではないが)、32ビットと同じである...このプロジェクトのためにハスケルやC++に切り替えるつもりですなら、私のための質問です。あなたは、そのCの対応、np.int64_tとしてnp.int64として及びdo_stufmatrix33dtypeを宣言する必要があります。

cimport numpy as np 
import numpy as np 

cdef do_stuff(np.ndarray[np.int64_t, ndim=2] matrix): 
    pass 

cdef matrix33(): 
    return np.zeros((3,3), dtype=int) 

def start(): 
    print do_stuff(matrix33()) 
+0

ありがとうございました、コードが正しく実行されます。しかし、それは私がすべてを長く宣言したときと同じくらい速く走ります。私は長いオブジェクトが高速ではないことを知っています。オーバーフローすることができず、異なる処理を受けます(より多くのサイクルを使用します)。オーバーフローする可能性のあるintを使用したいと思います。これは、長いpython型よりも高速です。 – Ihmahr

+0

また、翻訳されたPythonの速度が10%を少し下回っているため、私はタイプが正しくないことが疑わしいです。 – Ihmahr

+0

@ user1020753:タイプが正しいです。スピードアップは、あなたの機能で何をしているかによって異なります。 –