如果数组中的任何元素重复,则从多维数组中删除整个子数组

Remove entire sub array from multi-dimensional array if any element in array is duplicate

我在 Python 中有一个多维数组,其中数组的一个向量中可能有一个重复的整数。例如。

array = [[1,2,3,4],
         [2,9,12,4],
         [5,6,7,8],
         [6,8,12,13]]

我想完全删除包含之前出现的任何元素的向量。在这种情况下,向量 [2,9,12,4] 和向量 [6,11,12,13] 应该被删除,因为它们有一个元素(分别为 2 和 6)出现在该数组的前一个向量中。请注意 [6,8,12,13] 包含两个先前出现的元素,因此代码也应该能够处理这些场景。

结果数组最终应该是:

array = [[1,2,3,4],
         [5,6,7,8]]

我以为我可以用 np.unique(array, axis=0) 来实现这个,但是我找不到另一个函数来处理这个特殊的唯一性。

如有任何想法,我们将不胜感激。

这里有一个使用列表理解和设置交集的快速方法:

>>> array = [[1,2,3,4],
...          [2,9,12,4],
...          [5,6,7,8],
...          [6,8,12,13]]
>>> [v for i, v in enumerate(array) if not any(set(a) & set(v) for a in array[:i])]
[[1, 2, 3, 4], [5, 6, 7, 8]]

您可以使用排序数字数组和相应的行索引,如下所示:

number_info = array([[ 0,  1],
                     [ 0,  2],
                     [ 1,  2],
                     [ 0,  3],
                     [ 0,  4],
                     [ 1,  4],
                     [ 2,  5],
                     [ 2,  6],
                     [ 3,  6],
                     [ 2,  7],
                     [ 2,  8],
                     [ 3,  8],
                     [ 1,  9],
                     [ 1, 12],
                     [ 3, 12],
                     [ 3, 13]])

表示需要删除本数组第remove_idx = [2, 5, 8, 11, 14]行,指向原数组第rows_idx = [1, 1, 3, 3, 3]行。现在,代码:

flat_idx = np.repeat(np.arange(array.shape[0]), array.shape[1])
number_info = np.transpose([flat_idx, array.ravel()])
number_info = number_info[np.argsort(number_info[:,1])]
remove_idx = np.where((np.diff(number_info[:,1])==0) & 
                      (np.diff(number_info[:,0])>0))[0] + 1
remove_rows = number_info[remove_idx, 0]
output = np.delete(array, remove_rows, axis=0)

输出:

array([[1, 2, 3, 4],
       [5, 6, 7, 8]])