2013-07-04 7 views

答えて

8

はあなたが原因となります 2つの別々のアクセスを行っているので__getitem__への呼び出し:[x]は1であり、[y]が別です。 __getitem__でこれを直接処理する方法はありません。 board[x]には、個々のアイテムを取得するために[y]を使用することができる何らかのサブオブジェクトが返される必要があります。次に行う

def __getitem__(self, tup): 
    y, x = tup 
    return self.board[y][x] 

:あなたはおそらくしたいこと__getitem__はタプルを受け入れることです

board[x, y] 

(あなたが__getitem__board[x][y]との間で切り替えるxとyの順序を持​​っていることに注意してください---ということです意図的?)

2

board[x][y]board.__getitem__(x).__getitem__(y)を意味するので、Board.__getitem____getitem__をサポートし、xを覚えているビューのいくつかの種類を返すことがあります。これはちょっとした作業ですが、いくつかのユースケース(そのビューを渡すことなど)では非常に便利です。

もう1つのオプションはboard[x, y]です。これはboard.__getitem__((x, y))を意味します。これはタプルを__getitem__に渡すことに注意してください。手動で解凍する必要があります(2.xでこれを行うための構文的な砂糖がありますが、やや不明瞭で3.xにも入っているので避けてください)将来の移植作業のために)。あなたがb[x][y]を呼び出すとき、それは実際には2回__getitem__()を呼び出すため下記に示すように、

class Board(): 
    def __getitem__(self, x): 
     return self.board[x] 

3

ただやる

import numpy as np 
b = Board() 
b.board = np.random.random((3,3,3)) 
print (b[2][0]==(b[2])[0]).all() 
#True 

しかし、最高のは、あなたが「ドンように、np.ndarrayをサブクラス化することですこの方法を再実装する必要があります。

class Board(np.ndarray): 
    pass 
1

board[(x, y)] 

これはあまり意味がありませんが、多次元配列を簡単に持つことができます。あなたはおそらくNumPyをしたいということよりも、より高度な何かをしたい場合は

board[(1,6,34,2,6)] 

>>> from collections import defaultdict 
>>> board = defaultdict(lambda: 0) 
>>> board[(1,6,8)] = 7 
>>> board[(1,6,8)] 
7 
>>> board[(5,6,3)] 
0 

:実際には任意の数の次元:

board[(1,6,34,2,6)] 

ボードを作ることではdefaultdictはあなたもまばらな辞書を持つことができます。

関連する問題

 関連する問題