2

私は次の形式の行列を持っています:

    matrix = [[1,0,1],[0,1,0],[1,1,0]]

(私の実際の問題では、それははるかに大きいものですが、単純にしておきます。重要なのは、カウントが0と1だけであることです。)

マトリックス内のすべての要素について、変数「alive」に値を割り当て、それを取り巻く要素の数を表します。水平線については、次のようにしました。

    alive = matrix[i+1] + matrix[i-1]

しかし今、私は上(および下)の要素も考慮に入れたいと思いますが、それは同じ方法で行うことができます。

カウントしている要素のすぐ上の要素を取得するにはどうすればよいですか?

4

3 に答える 3

2

私は通常、次のようなものを使用して多次元リストにアクセスするのが好きです。

matrix = [[1,0,1],[0,1,0],[1,1,0]]
valatpos = dict()
for row, inner in enumerate(matrix):
  for col, val in enumerate(inner):
    valatpos[row,col] = val

次に、比較するときに、これを呼び出して値を取得し、行または列を任意の組み合わせで上下に移動します。

valatpos[i + 1, j] # Below
valatpos[i - 1, j] # Above
valatpos[i, j - 1] # Left
valatpos[i, j + 1] # Right
valatpos[i + 1, j + 1] # Below, Right    

私が好むのは:

matrix[i + 1][j]
于 2013-02-20T19:19:22.117 に答える
0

次のようなものがあなたが探しているものだと思います:

def get_alive(matrix):
    empty = [0]*(len(matrix[0])+2)
    temp = [empty] + [[0]+row+[0] for row in matrix] + [empty]
    def count(i, j):
        return (sum(temp[i-1][j-1:j+2]) + temp[i][j-1] + temp[i][j+1] +
                sum(temp[i+1][j-1:j+2]))
    rows = range(1, len(temp)-1)
    cols = range(1, len(temp[0])-1)
    return [[count(i, j) for j in cols] for i in rows]

例:

>>> import pprint
>>> matrix = [[1,0,1],[0,1,0],[1,1,0]]
>>> alive = get_alive(matrix)
>>> pprint.pprint(matrix, width=20)
[[1, 0, 1],
 [0, 1, 0],
 [1, 1, 0]]
>>> pprint.pprint(alive, width=20)
[[1, 3, 1],
 [4, 4, 3],
 [2, 2, 2]]
于 2013-02-20T19:31:18.487 に答える