【问题标题】:counting surrounding true's in numpy matrix (python)在numpy矩阵(python)中计算周围的真值
【发布时间】:2018-08-10 08:49:49
【问题描述】:

我想做一些类似于扫雷的东西

输入矩阵:

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

如果现场有炸弹,我不会将其视为炸弹在周围。

我曾想过以某种方式使用 numpy convolve 来做这件事,但我正在努力解决如何通过矩阵并始终检查实际字段的左、上、右和下字段(在边框的情况下,我检查“空" 字段肯定是 0)

【问题讨论】:

  • 带有甜甜圈形种子的二维卷积。
  • 不,它不一定是 numpy,但我认为这将是最好的解决方案,只是不知道如何让它工作。 @DanielF 嗯,那怎么样?

标签: python numpy


【解决方案1】:

这是使用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]])

【讨论】:

  • 该死,得到了 FGITW。您可以使用convolve2dboundarymode 参数进行所有填充和切片。
  • mode=same 就足够了,不需要边界 :P - 边界换行使输出实际上是错误的,因为它使 1,2,1 变为 2,1,2
  • 更新了!没有边界
【解决方案2】:

仅使用 numpy,包括来自 herend_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)

【讨论】:

    【解决方案3】:

    为简单起见:使用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 周围的单元格来完成矩阵。

    【讨论】:

      猜你喜欢
      • 2013-12-17
      • 1970-01-01
      • 2011-04-23
      • 1970-01-01
      • 2017-09-26
      • 1970-01-01
      • 1970-01-01
      • 2018-08-01
      • 2021-07-24
      相关资源
      最近更新 更多