2

我有一个形式的矩阵:

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

(在我的实际问题中,它是一个更大的问题,但我会保持简单。重要的是只计算零和一。)

对于矩阵中的每个元素,我想为变量“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 回答
1

您可以使用 numpy 的数组构造为整个矩阵计算存活:

import numpy as np

 # Your matrix defined as numpy array:
 matrix = np.array([[ 1, 0, 1 ], [ 0, 1, 1 ], [ 0, 0, 1 ]])

 # Get the size of the matrix
 nn = matrix.shape[0]

 # Create alive matrix by summing the four neighboring fields:
 alive = np.fromfunction(lambda i, j: matrix[(i+1)%nn, j] + matrix[(i-1)%nn, j]
    + matrix[i, (j+1)%nn] + matrix[i, (j-1)%nn], (nn, nn), dtype=int)

使用 numpy 数组,您可以alive[i, j]直接访问元素。

于 2013-02-20T19:29:18.120 回答
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 回答