我有一个形式的矩阵:
matrix = [[1,0,1],[0,1,0],[1,1,0]]
(在我的实际问题中,它是一个更大的问题,但我会保持简单。重要的是只计算零和一。)
对于矩阵中的每个元素,我想为变量“alive”分配一个值,表示围绕它的元素的数量。对于水平,我是这样做的:
alive = matrix[i+1] + matrix[i-1]
但现在我也想考虑上面(和下面,但可以用同样的方法)的元素。
如何检索我正在计算的元素正上方的元素?
我通常喜欢使用以下方式简单地访问多维列表:
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]
您可以使用 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]
直接访问元素。
我认为您正在寻找以下内容:
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]]