我想做一些类似于扫雷的事情
输入矩阵:
matrix = [[true, false, false],
[false, true, false],
[false, false, false]]
如果炸弹在场上,我不认为它是炸弹在附近。
我考虑过用numpy进行卷积,但是我一直在努力遍历矩阵并始终检查实际字段的左,上,右和下字段(如果是边框,则选中“空” “字段,该字段肯定为0)
答案 0 :(得分:4)
这是使用scipy.signal.convolve2d
的解决方案:
import scipy
import numpy as np
# Input matrix, can be left as boolean
matrix = np.array([[True, False, False],
[False, True, False],
[False, False, False]])
# Our dougnut filter
W = np.array([[1, 1, 1],
[1, 0, 1],
[1, 1, 1]])
# Single convolve
res = convolve2d(matrix, W, 'same')
我们得到确切的结果:
res
array([[1, 2, 1],
[2, 1, 1],
[1, 1, 1]])
答案 1 :(得分:1)
仅使用numpy
,包括here中的nd_window
m_pad = np.pad(matrix, ((1,1),(1,1)), 'constant', constant_values=(False, False))
filter = np.array([[1,1,1],[1,0,1],[1,1,1]], dtype = bool)
adj_matrix = np.einsum('ijkl,kl->ij', nd_window(m_pad, 3), filter)
此外,您可以使用scipy.signal.convolve2d
adj_matrix = convolve2d(matrix, filter, 'same', fillvalue = False)
答案 2 :(得分:0)
为简单起见:使用numpy
可以简单地使用sum()
方法(https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.matrix.sum.html)。
np.matrix(matrix).sum()
将计算矩阵中的所有True
。
所以np.matrix(matrix).sum() - matrix[1][1]
应该返回一个单元格周围的地雷数量。
对我来说,消除边界问题的最简单方法是用周围的False
个单元格完成矩阵。