numpy 查找唯一行(只出现一次)

numpy find unique rows (only appeared once)

例如,我根据列表 B 拆分一个数组 A 得到了很多子数组:

A = np.array([[1,1,1],
              [2,2,2],
              [2,3,4],
              [5,8,10],
              [5,9,9],
              [7,9,6],
              [1,1,1],
              [2,2,2],
              [9,2,4],
              [9,3,6],
              [10,3,3],
              [11,2,2]])
B = np.array([5,7])
C = np.split(A,B.cumsum()[:-1])
>>>print(C)
>>>array([[1,1,1],
          [1,2,2],
          [2,3,4],
          [5,8,10],
          [5,9,9]]),
   array([[7,9,6],
          [1,1,1],
          [2,2,2],
          [9,2,4],
          [9,3,6],
          [10,3,3],
          [11,2,2]])

如何找到所有子数组中只出现一次的行(删除那些出现两次的行)?这样我就可以得到这样的结果:(因为 [1,1,1] 和 [2,2,2] 在 C 中出现了两次)

>>>array([[2,3,4],
          [5,8,10],
          [5,9,9]]),
   array([[7,9,6],
          [9,2,4],
          [9,3,6],
          [10,3,3],
          [11,2,2]])

您可以使用 np.unique 来识别重复项:

_, i, c = np.unique(A, axis=0, return_index=True, return_counts=True)

idx = np.isin(np.arange(len(A)), i[c==1])

out = [a[i] for a,i in zip(np.split(A, B.cumsum()[:-1]),
                           np.split(idx, B.cumsum()[:-1]))]

输出:

[array([[ 2,  3,  4],
        [ 5,  8, 10],
        [ 5,  9,  9]]),
 array([[ 7,  9,  6],
        [ 9,  2,  4],
        [ 9,  3,  6],
        [10,  3,  3],
        [11,  2,  2]])]