【问题标题】:How to find sum of neighbor elements in a matrix如何找到矩阵中相邻元素的总和
【发布时间】:2018-03-13 14:26:04
【问题描述】:

我试图找到矩阵中一个元素周围的邻居的总和,并编写了几个函数来将布尔矩阵转换为 1 和 0 并找到邻居。但我不确定它为什么会抛出以下错误

matrix=[[True,False,False],[False,True,False],[False,False,False]]
def minesweeper(matrix):
    matrix=[[1 if j==True else 0 for j in i] for i in matrix]
    bin_mt = matrix.copy()
    print(bin_mt)
    for i in range(len(matrix)):
        for j in range(len(matrix[0])):
            matrix[i][j]=get_neighbors(i,j,matrix, bin_mt)
            print('matrix: '+str(matrix))
            print('bin_mt: '+str(bin_mt))

    print(matrix)
    return matrix

def get_neighbors(a, b, matrix, bin_mt):
    sum=0
    if bin_mt[a][b]==1:
        return 1
    else:
        for i in find_neighbor_indices(matrix,a,b):
            print(bin_mt[i[0]][i[1]], end=' ')
            sum=sum+bin_mt[i[0]][i[1]]
        print('--')
        return sum

def find_neighbor_indices(matrix, i, j, dist=1):
    neighbors = []
    irange = range(max(0,i-dist), min(len(matrix), i+dist+1))
    if len(matrix) > 0:
        jrange = range(max(0, j - dist), min(len(matrix[ 0 ]), j + dist + 1))
    else:
        jrange = []
    for icheck in irange:
        for jcheck in jrange:
            if icheck != i or jcheck != j:
                neighbors.append((icheck, jcheck))
    return neighbors
minesweeper(matrix)

PS:我已经更新了代码。但是,我创建了一个包含 1 和 0 的矩阵,用于比较和邻居的总和。但我不确定为什么它同时更新 bin_mat 和实际矩阵,而不仅仅是实际矩阵。有人可以帮我解决这个问题。

【问题讨论】:

  • 您将i ([True, False, False]) 传递给get_neighbors 作为a,然后将a ([True, False, False]) 传递给find_neighbor_indices 作为i,因此i 是一个列表
  • 您的错误信息与您的代码不匹配 - 里面没有这样一行。
  • Using convolution,你可以在一个地方做到这一点
  • @很快我已经更新了代码。但是,我没有得到预期的输出。请帮我解决这个问题。
  • 请学习如何使用调试器

标签: python python-3.x python-2.7 list matrix


【解决方案1】:

不用担心。我想到了。问题是二进制矩阵是实际矩阵的浅拷贝。无论我在实际矩阵中所做的更改都在二进制矩阵中得到更新。我需要一个深拷贝而不是浅拷贝。 使用下面的代码解决它。

import copy
bin_mt = copy.deepcopy(matrix)

而不是

bin_mt = matrix.copy()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-20
    • 2012-09-10
    • 2021-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-16
    相关资源
    最近更新 更多