5

Python (2.7) クラス内に、その周囲の「セル」の値を 2 次元の numpy 配列で取得する関数があります。インデックスが範囲外の場合、値を None に設定する必要があります。

以下のコードのように、8 つの try/catch ステートメントを記述したり、複数の if x else None ステートメントを使用したりせずに、これを行う方法を見つけるのに苦労しています。どちらも機能しますが、あまりうまく構造化されていないようです。これを行うには、もっと簡単な方法があるに違いないと思います。おそらく、これについて完全に間違った方法で考えているようです。どんな助けでも大歓迎です。

# This will return a dictionary with the values of the surrounding points
def get_next_values(self, column, row):
    if not (column < self.COLUMNS and row < self.ROWS):
        print "Invalid row/column."
        return False

    nextHorizIsIndex = True if column < self.COLUMNS - 2 else False
    nextVertIsIndex = True if row < self.ROWS - 2 else False

    n = self.board[column, row-1] if column > 0 else None
    ne = self.board[column+1, row-1] if nextHorizIsIndex else None
    e = self.board[column+1, row] if nextHorizIsIndex else None
    se = self.board[column+1, row+1] if nextHorizIsIndex and nextVertIsIndex else None
    s = self.board[column, row+1] if nextVertIsIndex else None
    sw = self.board[column-1, row+1] if nextVertIsIndex else None
    w = self.board[column-1, row] if row > 0 else None
    nw = self.board[column-1, row-1] if 0 not in [row, column] else None

    # debug
    print n, ne, e, se, s, sw, w, nw
4

1 に答える 1

6

ここに標準的なトリックがあります: 値 None でパディングされたエッジでボードを作成します。次に、内側の 3x3 の正方形にアクセスし、適切な値を次のように入力します。

nw, n, ne, w, _, e, sw, s, se = (self.board[column-1:column+2, row-1:row+2]).ravel()

例えば、

import numpy as np

board = np.empty((10,10), dtype = 'object')
board[:,:] = None
board[1:9, 1:9] = np.arange(64).reshape(8,8)
print(board)
# [[None None None None None None None None None None]
#  [None 0 1 2 3 4 5 6 7 None]
#  [None 8 9 10 11 12 13 14 15 None]
#  [None 16 17 18 19 20 21 22 23 None]
#  [None 24 25 26 27 28 29 30 31 None]
#  [None 32 33 34 35 36 37 38 39 None]
#  [None 40 41 42 43 44 45 46 47 None]
#  [None 48 49 50 51 52 53 54 55 None]
#  [None 56 57 58 59 60 61 62 63 None]
#  [None None None None None None None None None None]]

column = 1
row = 1
nw, n, ne, w, _, e, sw, s, se = (board[column-1:column+2, row-1:row+2]).ravel()
print(nw, n, ne, w, _, e, sw, s, se)
# (None, None, None, None, 0, 1, None, 8, 9)

ご了承ください

  • この方法でボードを定義すると、最初の非 None インデックスは 0 ではなく 1 になります。
  • 最初のインデックスを行、2 番目のインデックスを列と考える方が一般的だと思います。これはprint(board) 、値がフォーマットされる方法だからです。だからおそらくあなたはboard[row-1:row+2, column-1:column+2]代わりに欲しい. もちろん、独自のprint_board関数を定義して、好きな規則を自由に使用することもできます。
于 2013-02-04T02:26:51.117 に答える