python - 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
目标是找到这些矩阵中可能的最小差异。
小矩阵总是有奇数行和列,所以很容易找到它的中心。
解决方案
您可以遍历可行的行和列并压缩切片big
以small
计算差异的总和,并用于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))
推荐阅读
- android - 来自 Activity 的命令 ViewPager 按钮 OnClick
- python - 使用排序规则创建索引
- spring-boot - 当从 derby 移动到 mysql 基础时,spring-boot 应用程序中存在配置错误?
- android - 应用程序被杀死后片段仍然存在(Android)
- c#-7.3 - 针对多个框架的 C#
- html - 错误错误:Angular 5 中的 ExpressionChangedAfterItHasBeenCheckedError
- yii2 - 在命令行中运行 Yii2 queue/run 会导致 Windows Ampps 出错
- css - 当元素到达底部边缘时设置不透明度
- vim - 在 Vim 中使用 ALE 打印 lint 排除
- python - 生成缺失的多索引