如何检查二维数组是否在另一个二维数组中

时间:2016-09-02 06:54:21

标签: python pandas numpy scipy

考虑两个数据框df1df2

df1 = pd.DataFrame(np.zeros((6, 6)), list('abcdef'), list('abcdef'), dtype=int)
df1.iloc[2:4, 2:4] = np.array([[1, 2], [3, 4]])

df1

enter image description here

df2 = pd.DataFrame(np.array([[1, 2], [3, 4]]), list('CD'), list('CD'), dtype=int)

df2

enter image description here

很明显,df2位于df1。我如何测试这一般?

2 个答案:

答案 0 :(得分:3)

假设数据框仅包含0's1s,您可以使用2D convolution并查看回旋输出中的任何元素是否等于df2中的元素数量 -

from scipy.signal import convolve2d

out = (convolve2d(df1,df2)==df2.size).any()

对于一般情况,让我使用skimage modulethis smart solution -

from skimage.util import view_as_windows as viewW

out = ((viewW(df1.values, df2.shape) == df2.values).all(axis=(2,3))).any()

这基本上是一个模板匹配问题,已经讨论过,我们在这篇文章中得到了非常有效的解决方案:How can I check if one two-dimensional NumPy array contains a specific pattern of values inside it?。该帖子还为我们提供了df1中可能找到df2的所有地点的索引。

答案 1 :(得分:1)

蛮力

def isin2d(small_df, large_df):
    di, dj = small_df.shape
    mi, mj = large_df.shape
    for i in range(mi - di + 1):
        for j in range(mj - dj + 1):
            if (small_df.values == large_df.values[i:i + di, j:j + dj]).all():
                return True

    return False

isin2d(df2, df1)

True