我有两个二维数组 a 和 b(#columns of a <= #columns in b)。我想找到一种有效的方法来将数组 a 中的一行与数组 b 中一行的连续部分匹配。
a = np.array([[ 25, 28],
[ 84, 97],
[105, 24],
[ 28, 900]])
b = np.array([[ 25, 28, 84, 97],
[ 22, 25, 28, 900],
[ 11, 12, 105, 24]])
输出应该是 np.array([[0,0], [0,1], [1,0], [2,2], [3,1]]) .数组 a 中的第 0 行与数组 b 中的第 0 行匹配(前两个位置)。数组 a 中的第 1 行与数组 b 中的第 0 行匹配(第三和第四位置)。
请您参考如下方法:
我们可以利用 np.lib.stride_tricks.as_strided基于 scikit-image's view_as_windows为了有效地提取补丁,然后将这些补丁与 a 的每一行进行比较,所有这些都以矢量化的方式进行。然后,使用 np.argwhere -
# a and b from posted question
In [325]: from skimage.util.shape import view_as_windows
In [428]: w = view_as_windows(b,(1,a.shape[1]))
In [429]: np.argwhere((w == a).all(-1).any(-2))[:,::-1]
Out[429]:
array([[0, 0],
[1, 0],
[0, 1],
[3, 1],
[2, 2]])
或者,我们可以通过在执行广播比较时向前推a 的第一个轴,按a 中的行顺序获取索引-
In [444]: np.argwhere((w[:,:,0] == a[:,None,None,:]).all(-1).any(-1))
Out[444]:
array([[0, 0],
[0, 1],
[1, 0],
[2, 2],
[3, 1]])
