如果数组中的任何元素重复,则从多维数组中删除整个子数组
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]])
我在 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]])