Python 对齐两个二进制矩阵以实现最大重叠

Python 对齐两个二进制矩阵以实现最大重叠,python,numpy,matrix,binary,counting,Python,Numpy,Matrix,Binary,Counting,我想找出两个二进制矩阵的最大重叠1,只允许平移(不允许旋转和反射)。我的问题非常类似于,但我想做的是以一种有效的方式编写OP在该问题中提出的“幼稚”解决方案 因此,总而言之,我有两个矩阵(不一定大小相同),其条目为0或1,例如: [0 0] [0 0 1] A: [1 1] B: [0 0 1] [1 0] [1 0 0] 通过将一个矩阵的一个角与另一个矩阵的每个可能位置对齐,并计算所有重叠1,可以找到最大重叠。然后,我们发现最大重叠是two,并且当我们将A

我想找出两个二进制矩阵的最大重叠
1
,只允许平移(不允许旋转和反射)。我的问题非常类似于,但我想做的是以一种有效的方式编写OP在该问题中提出的“幼稚”解决方案

因此,总而言之,我有两个矩阵(不一定大小相同),其条目为
0
1
,例如:

   [0 0]      [0 0 1]
A: [1 1]   B: [0 0 1]
   [1 0]      [1 0 0]
通过将一个矩阵的一个角与另一个矩阵的每个可能位置对齐,并计算所有重叠
1
,可以找到最大重叠。然后,我们发现最大重叠是two,并且当我们将A的左下角(2,0)与B的(1,2)对齐时给出


我想用python编写此方法的一个简单(可能是快速)实现,但我真的不知道从哪里开始…

要找到最大重叠,您可以使用scipy的
correlate2d
函数:

import scipy

scipy.signal.correlate2d(a, b).max()
或者您可以使用numpy从头开始实现它(这有点棘手):

import numpy as np
from numpy.lib.stride_tricks import as_strided


def max_overlap(a, b):
    b_p = np.pad(b, ((a.shape[0]-1, a.shape[0]-1), (a.shape[1]-1, a.shape[1]-1)), 'constant', constant_values=0)
    output_shape = (b_p.shape[0] - a.shape[0] + 1, b_p.shape[1] - a.shape[1] + 1)
    b_w = as_strided(b_p, shape=output_shape + a.shape,
                          strides=b_p.strides*2)
    c = (b_w * a).sum(axis=(2,3))
    return c.max()