我有一个 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/