首页 > 解决方案 > python中的矩阵匹配

问题描述

如何在大矩阵中找到小矩阵的最佳“匹配”?例如:

 small=[[1,2,3],
        [4,5,6],
        [7,8,9]]



    big=[[2,4,2,3,5],
         [6,0,1,9,0],
         [2,8,2,1,0],
         [7,7,4,2,1]]

匹配被定义为矩阵中数字的差异,因此位置 (1,1) 中的匹配就好像从小的数字 5 将在大矩阵的数字 0 上(所以坐标 (1,1) 中小矩阵的中心数字的大矩阵。

(1,1)位置的匹配值为:m(1,1)=|2−1|+|4−2|+|2−3|+|6−4|+|0−5|+| 1−6|+|2−7|+|8−8|+|2−9|=28

目标是找到这些矩阵中可能的最小差异。

小矩阵总是有奇数行和列,所以很容易找到它的中心。

标签: pythonpython-3.xmatrixsimilarity

解决方案


您可以遍历可行的行和列并压缩切片bigsmall计算差异的总和,并用于min找到差异中的最小值:

from itertools import islice
min(
    (
        sum(
            sum(abs(x - y) for x, y in zip(a, b))
            for a, b in zip(
                (
                    islice(r, col, col + len(small[0]))
                    for r in islice(big, row, row + len(small))
                ),
                small
            )
        ),
        (row, col)
    )
    for row in range(len(big) - len(small) + 1)
    for col in range(len(big[0]) - len(small[0]) + 1)
)

或在一行中:

min((sum(sum(abs(x - y) for x, y in zip(a, b)) for a, b in zip((islice(r, col, col + len(small[0])) for r in islice(big, row, row + len(small))), small)), (row, col)) for row in range(len(big) - len(small) + 1) for col in range(len(big[0]) - len(small[0]) + 1))

这将返回:(24, (1, 0))


推荐阅读