python - 如何查找 numpy 矩阵中是否存在子矩阵?

标签 python numpy numpy-ndarray

我有一个 8x8 bool 矩阵,我想找出该矩阵中是否有一个 3x3 形状的子矩阵,其中只有“False”。

例如:

子矩阵:

[[False, False, False],
[False, False, False],
[False, False, False]]

为子矩阵(左上角)留出空间的矩阵:

array([[False, False, False, False, False, False, False, False],
       [False, False, False, False, True, False, True, False],
       [False, False, False, False, False, False, False, False],
       [False, False, False, True, False, False, False, False],
       [False, False, False, False, False, False, False, False],
       [False, True, False, False, False, True, False, False],
       [False, False, False, True, False, False, False, False],
       [False, False, False, False, False, False, False, False]])

没有子矩阵空间的矩阵:

array([[False, False, False, False, False, False, False, False],
       [False, True, False, True, False, True, False, False],
       [False, True, False, False, True, False, False, True],
       [False, False, False, False, False, False, False, False],
       [False, True, False, True, False, True, False, False],
       [False, False, True, False, False, False, True, False],
       [False, True, False, False, True, False, False, False],
       [False, False, False, True, False, False, True, False]])

最佳答案

您可以使用大小为 3x3 的窗口的滑动窗口方法:

import numpy as np
from numpy.lib.stride_tricks import sliding_window_view



x = np.array([[False, False, False, False, False, False, False, False],
              [False, False, False, False, True, False, True, False],
              [False, False, False, False, False, False, False, False],
              [False, False, False, True, False, False, False, False],
              [False, False, False, False, False, False, False, False],
              [False, True, False, False, False, True, False, False],
              [False, False, False, True, False, False, False, False],
              [False, False, False, False, False, False, False, False]])


v = sliding_window_view(x, (3, 3))

v.sum(axis=(2,3))

array([[0, 0, 1, 1, 2, 1],
       [0, 1, 2, 2, 2, 1],
       [0, 1, 1, 1, 0, 0],
       [1, 2, 1, 2, 1, 1],
       [1, 2, 1, 2, 1, 1],
       [1, 2, 1, 2, 1, 1]])

其中0的位置是矩阵中子矩阵左上角的位置。

编辑:如果您有任何子矩阵 s,而不仅仅是其中的 False,您可以执行以下操作:

np.all(v == s, axis=(2,3))

并寻找真值的位置。

关于python - 如何查找 numpy 矩阵中是否存在子矩阵?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73425465/

相关文章:

python - 访问违规异常 Oculus VR DK2

python - curve_fit 包含 numpy 数组的 2D 函数 --> 形状 (3,3,9) 和 (3,1) 未对齐 : 9 (dim 2) ! = 3 (dim 0)

python - Python 中 numpy 数组上交换行的表示法

python - 具有多个 X 特征和 Python 中的单个 Y 的散点图

python - for循环中的递增计数器

python - 使用openCV python在相同颜色的图像周围绘制轮廓

python - 如何检查 pandas DataFrame 中的列值类型

python - 优化非线性方程组 - 处理复数

python - 如何使用python减少音频数据数组中的样本数量

python - 如何将 Tensor 转换为 ndarray(内部含有对抗性图像的张量)