Skip to main content
 首页 » 编程设计

python之识别numpy中的子数组

2025年05月04日22mengfanrong

我有两个二维数组 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]])