Python 矩阵函数对整个矩阵进行运算,作为一个滤波器来确定相邻单元中的地雷

Python 矩阵函数对整个矩阵进行运算,作为一个滤波器来确定相邻单元中的地雷,python,Python,我必须使用python创建一个扫雷游戏,这是codesignal INTRO挑战的一部分 我试过一个代码,但它不适用于最后一行和最后一列 我已经尝试过这个代码,但它不起作用,我无法找出这个问题发生的原因 import numpy as np matrix = [[True,False,False,True], [False,False,True,False], [True,True,False,True]] def minesweeper(matrix): re=np.zer

我必须使用python创建一个扫雷游戏,这是codesignal INTRO挑战的一部分

我试过一个代码,但它不适用于最后一行和最后一列 我已经尝试过这个代码,但它不起作用,我无法找出这个问题发生的原因

import numpy as np

matrix = [[True,False,False,True], 
 [False,False,True,False], 
 [True,True,False,True]]

def minesweeper(matrix):
    re=np.zeros((len(matrix),len(matrix[0])))
    for i in range(len(matrix)-1):
        #print(i)
        for j in range(len(matrix[0])-1):
            #print(j)
            if (j==0) and (i==0):

                re[i][j]=matrix[i][j+1]+matrix[i+1][j]+matrix[i+1][j+1]

            elif (j==len(matrix[0])-1)and(i==0):
                re[i][j]=matrix[i][j-1]+matrix[i+1][j]+matrix[i+1][j-1]

            elif (i==len(matrix)-1)and (j==0) :
                re[i][j]=matrix[i-1][j]+matrix[i-1][j+1]+matrix[i][j+1]

            elif (i==len(matrix)-1)and(j==len(matrix[0])-1):
                re[i][j]=matrix[i][j-1]+matrix[i-1][j]+matrix[i-1][j-1]

            elif (i==0 and j!=0) or (i==0 and j!=len(matrix[0])-1):
                re[i][j]=matrix[i][j-1]+matrix[i][j+1]+matrix[i+1][j-1]+matrix[i+1][j]+matrix[i+1][j+1]

            elif (i==(len(matrix)-1) and j!=0) or (i==(len(matrix)-1) and j!=len(matrix[0])-1):
                re[i][j]=matrix[i][j-1]+matrix[i][j+1]+matrix[i+1][j]+matrix[i+1][j-1]+matrix[i+1][j+1]

            elif  (j==0 and i!=0)and (j==0 and i!=len(matrix)-1):
                re[i][j]=matrix[i+1][j]+matrix[i-1][j]+matrix[i+1][j+1]+matrix[i][j+1]+matrix[i-1][j+1]
            elif (j==len(matrix[0])-1 and i!=0) and (j==len(matrix[0])-1 and i!=len(matrix)-1):
                re[i][j]=matrix[i+1][j]+matrix[i-1][j]+matrix[i+1][j+1]+matrix[i][j+1]+matrix[i-1][j+1]

            else:
                re[i][j]=matrix[i-1][j]+matrix[i+1][j]+matrix[i][j-1]+matrix[i][j+1]+matrix[i-1][j-1]+matrix[i+1][j-1]+matrix[i-1][j+1]+matrix[i+1][j+1]
    return re


minesweeper(matrix)


Output should be 
[[0,2,2,1], 
 [3,4,3,3], 
 [1,2,3,1]]

But I am getting 
[[0., 2., 2., 0.],
       [3., 4., 3., 0.],
       [0., 0., 0., 0.]]
原因是rangelenmatrix-1 rangelenmatrix[0]-1不包括最后一列和最后一行,我认为如果你单独处理边界问题,逻辑非常复杂,你可以把它们放在一起,访问8个邻居,统一检查边界,如下所示:

def minesweeper(matrix):
    re = np.zeros((len(matrix), len(matrix[0])))
    for i in range(len(matrix)):
        for j in range(len(matrix[0])):
            for I, J in (i - 1, j - 1), (i - 1, j), (i - 1, j + 1), (i, j - 1), (i, j + 1), (i + 1, j - 1), (
            i + 1, j), (i + 1, j + 1):
                if 0 <= I < len(matrix) and 0 <= J < len(matrix[0]):
                    re[i][j] += matrix[I][J]
我认为np.zero不适合这里,您可以使用2d列表:

re = [[0] * len(matrix[0]) for _ in range(len(matrix))]

尝试强制在输出值中键入int。您可以尝试使用:return intre
re = [[0] * len(matrix[0]) for _ in range(len(matrix))]