首页 > 解决方案 > 模式匹配python,如何在python中使用矩阵?

问题描述

我有一个这样的矩阵

matrix = 
   [
     [1,0,0]
     [0,1,0]
     [0,0,0]
   ]
pattern = 
   [
     [1,0]
     [0,1]
   ]
>>>Should output: Pattern found at index 0

我需要查找是否存在与输入中给出的另一个矩阵匹配的模式第一个矩阵可以是 MxN,而输入中给出的矩阵必须是 PxQ,其中 P < M 和 Q < N。我试图创建子矩阵和然后将那些与我在输入中给出的匹配,但对我来说没有运气!你有什么建议吗?

标签: python

解决方案


np.lib.stride_tricks.sliding_window_viewNumpy 可以使用方法为您创建那些“子矩阵” 。它将矩阵和较小矩阵的形状作为参数。

然后,您只需要使用np.all指定矩阵的所有元素都需要匹配才能计数并将形状(2,2,2,2)矩阵折叠为 shape (2,2)

import numpy as np

matrix = np.array([
    [1, 0, 0],
    [0, 1, 0],
    [0, 0, 0],
])
pattern = np.array([
    [1, 0],
    [0, 1]
])

print(np.all(np.all(np.lib.stride_tricks.sliding_window_view(matrix, pattern.shape) == pattern, axis=3), axis=2))

或者,如果您想避免使用库,您可以编写自己的滑动窗口函数:

    [1, 0, 0],
    [0, 1, 0],
    [0, 0, 0],
]
pattern = [
    [1, 0],
    [0, 1]
]


def sliding_window_view(matrix, window_shape):
    h, w = len(matrix), len(matrix[0])
    window_h, window_w = window_shape

    for y in range(h - window_h + 1):
        yield [
            [row[x:x + window_w] for row in matrix[y:y + window_h]]
            for x in range(w - window_w + 1)
        ]


def find_pattern(matrix, pattern):
    sub_matrices_matrix = sliding_window_view(matrix, (len(pattern), len(pattern[0])))
    for sub_matrices_row in sub_matrices_matrix:
        yield [sub_matrix == pattern for sub_matrix in sub_matrices_row]


print(list(find_pattern(matrix, pattern)))

这不是特别有效,因为它为每个子矩阵创建新列表,但是与更优化的替代方案相比,它相当容易理解。


推荐阅读