python - 模式匹配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。我试图创建子矩阵和然后将那些与我在输入中给出的匹配,但对我来说没有运气!你有什么建议吗?
解决方案
np.lib.stride_tricks.sliding_window_view
Numpy 可以使用方法为您创建那些“子矩阵” 。它将矩阵和较小矩阵的形状作为参数。
然后,您只需要使用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)))
这不是特别有效,因为它为每个子矩阵创建新列表,但是与更优化的替代方案相比,它相当容易理解。
推荐阅读
- java - 用长方形做一个圆
- javascript - 浏览器没有从 html 页面加载我的 java-script 文件
- php - Eloquent 根据关系的过滤器获取行。
- xml - XSLT 2.0:增加时间和开场比赛
- sql - on-clause 中的 SQLite 约束不起作用
- apache - NAT 端口转发不起作用,而 ssh 隧道起作用
- c++ - 寻找最小的下一个更大的元素
- angular - “OperatorFunction”类型上不存在属性“catch”
' - c# - 如果它们附加到不同的对象并且在不同的场景中,如何将分数传递给记分牌c#
- python - Python,纸牌游戏,AttributeError