检测多个numpy 2-d数组中的第一个唯一行

Wil*_*ren 4 python arrays numpy scipy

我有多个numpy 2-d数组,我想比较行.我的函数的输出应该是一个numpy二维数组,表示三个输入数组的所有行.我希望能够检测到第一次出现行,每秒或第三个重复行应该在输出中标记为False.单个数组中不可能有重复的行.

如果有可能我想避免使用循环,因为它们会降低计算速度.

例:

array1 = array([[444, 427],
   [444, 428],
   [444, 429],
   [444, 430],
   [445, 421]], dtype=uint64)

array2 = array([[446, 427],
   [446, 440],
   [444, 429],
   [444, 432],
   [445, 421]], dtype=uint64)

array3 = array([[447, 427],
   [446, 441],
   [444, 429],
   [444, 432],
   [445, 421]], dtype=uint64)

# output
array([[True, True, True, True,  True],
   [ True,  True,  False, True,  False],
   [ True,  True,  False, False,  False]], dtype=bool)
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

ali*_*i_m 7

这是一种快速矢量化方法:

def find_dupe_rows(*arrays):

    A = np.vstack(arrays)
    rtype = np.dtype((np.void, A.dtype.itemsize*A.shape[1]))
    _, first_idx = np.unique(A.view(rtype), return_index=True)
    out = np.zeros(A.shape[0], np.bool)
    out[first_idx] = True

    return out.reshape(len(arrays), -1)
Run Code Online (Sandbox Code Playgroud)

用法示例:

print(find_dupe_rows(array1, array2, array3))
# [[ True  True  True  True  True]
#  [ True  True False  True False]
#  [ True  True False False False]]
Run Code Online (Sandbox Code Playgroud)

为了打破这一点:

  1. 堆叠三个子阵列以生成(15, 2)数组:

    A = np.vstack((array1, array2, array3))
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用np.unique连同这一招,以有效地找到每个唯一行第一中出现的指标A:

    rtype = np.dtype((np.void, A.dtype.itemsize * A.shape[1]))
    _, first_idx = np.unique(A.view(rtype), return_index=True)
    
    Run Code Online (Sandbox Code Playgroud)
  3. 不是第一次出现的唯一行的每一行都可以视为重复:

    out = np.zeros(A.shape[0], np.bool)     # output is False by default
    out[first_idx] = True                   # set first occurrences to True
    
    Run Code Online (Sandbox Code Playgroud)
  4. 最后,(narrays, nrows)根据您的示例输出重新整形此布尔向量:

    return out.reshape(len(arrays), -1)
    
    Run Code Online (Sandbox Code Playgroud)