python - 查找较大二维矩阵中存在较小二维矩阵的位置

标签 python numpy

假设我有以下 6x6 矩阵 a 和 2x2 矩阵 b:

a = np.array([[1, 1, 1, 0, 0, 0],
              [1, 0, 1, 0, 1, 0],
              [1, 0, 0, 0, 0, 1],
              [1, 1, 1, 1, 1, 0],
              [0, 0, 0, 0, 0, 0],
              [1, 0, 0, 1, 1, 1]])

b = np.array([[0, 1],
              [0, 0]])

我想创建一个真值表,其中较小的数组二维矩阵存在于较大的数组内部,但仅选择左上角索引

预期输出:

>>> array([[False, False, False, False, False, False],
           [False, True,  False, True,  False, False],
           [False, False, False, False, False, False],
           [False, False, False, False, False, False],
           [False, False, False, False, False, False],
           [False, False, False, False, False, False]])

我想我可以构建一个巨大的循环并使用 np.roll() 进行评估,但我希望有一个优雅的解决方案?

最佳答案

您可以使用np.lib.stride_tricks.as_strided创建带有两个附加维度的 a 版本用于比较。然后您可以使用 .all(axis=(-2, -1)) 来验证相等性:

In [3]: a2 = np.lib.stride_tricks.as_strided(a, shape=a.shape + b.shape, strides=2*a.strides)
In [4]: a2 = a2[:-b.shape[0]+1, :-b.shape[1]+1]
In [5]: (a2 == b).all(axis=(-2, -1))                                                          
Out[5]: 
array([[False, False, False, False, False],
       [False,  True, False,  True, False],
       [False, False, False, False, False],
       [False, False, False, False, False],
       [False, False, False, False, False]])

如果你想要额外的填充,你可以使用 np.pad事先:

a = np.pad(a, ((0, 1), (0, 1)), mode='wrap')

然后按照上面的 as_strided 继续操作。

关于python - 查找较大二维矩阵中存在较小二维矩阵的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61397050/

相关文章:

python - 查找元素在字符串中出现次数的索引

python - 如何将(时间戳,值)数组转换为时间序列

python - 如何在 Python 2.6 中使用 Numerical Python

python - 使用 Swig 将 numpy 字符串数组传递给 C

python - 如何使用postgresql删除python中三列组合的重复项

python - 如何更改标题数据

python - pytest - 辅助函数或 fixture 、参数化

Python ASCII 到二进制

r - 用于计算(平方)马氏距离的矢量化代码

python - Python 中嵌套列表的算术运算