python之查找较大二维矩阵中存在较小二维矩阵的位置
mfryf
阅读:30
2025-05-04 20:05:19
评论:0
假设我有以下 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
继续操作。
声明
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。