在numpy矩阵中计算周围的真实值(python)

时间:2018-08-10 08:49:50

标签: python numpy

我想做一些类似于扫雷的事情

输入矩阵:

matrix = [[true, false, false],
          [false, true, false],
          [false, false, false]]

如果炸弹在场上,我不认为它是炸弹在附近。

我考虑过用numpy进行卷积,但是我一直在努力遍历矩阵并始终检查实际字段的左,上,右和下字段(如果是边框,则选中“空” “字段,该字段肯定为0)

enter image description here

3 个答案:

答案 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个单元格完成矩阵。