如何对n维numpy数组按高维排序并重排段以消除重复项?
n维NumPy数组去重:通过统一排序规则实现可比较性
问题需求
我有一组维度相同的n维ndarray数组列表,需要定义统一的排序规则,让这些数组能够互相比较,最终去除重复项。
举个例子:
- 二维数组中,以下几个数组视为重复:
[[1, 0], [0, 1]] == [[0, 1], [0, 1]] == [[1, 0], [1, 0]] == [[0, 1], [1, 0]]
- 三维数组中,以下数组也视为重复:
[[[1,1],[0,2]],[[0,0],[0,0]]] == [[[0, 0], [0, 0]],[[1, 1],[0, 2]]] == [[[0, 0], [0, 0]],[[0, 2], [1, 1]]]
具体排序方式无所谓,只要能准确识别并去除重复项就行。
现有方法的问题
- 直接用
numpy.sort(array)无法识别部分重复情况,比如[[0,0],[0,1]]和[[0,1],[0,0]]会被当成不同的数组。 - 如果从最高维度开始逐维排序,会破坏原数组的子结构,比如
[[1, 1], [0, 2]]会被排序成[[0, 1], [1, 2]],改变了原本的子数组组成。
解决方案:嵌套层级递归排序
从嵌套列表的角度出发,采用递归逐层标准化的思路:
- 先对最深层(第n层)的所有子数组进行排序;
- 从第n-1层开始,向上遍历到第0层:
- 对当前层的每个子数组,先按子数组的元素和排序;
- 如果两个子数组的和相等,则直接比较子数组的元素进行排序。
代码实现
通过递归函数将numpy数组转换成嵌套列表处理,再转回numpy数组,生成每个数组的“标准化”版本,最后基于标准化数组去重:
import numpy as np def standardize_array(arr): # 递归终止条件:一维数组直接排序返回列表 if arr.ndim == 1: return sorted(arr.tolist()) # 先递归标准化每个子数组 standardized_subs = [standardize_array(sub) for sub in arr] # 当前层排序规则:先按子数组元素和,再按子数组本身 sort_key = lambda x: (sum(map(sum, x)) if isinstance(x[0], list) else sum(x), x) standardized_subs.sort(key=sort_key) return standardized_subs # 数组去重函数 def deduplicate_arrays(arr_list): # 标准化后转成可哈希的tuple standardized_tuples = [tuple(map(tuple, standardize_array(arr))) for arr in arr_list] # 去重后转回numpy数组 unique_arrays = [np.array(arr_tuple) for arr_tuple in set(standardized_tuples)] return unique_arrays
测试示例
# 测试二维数组 arr1 = np.array([[1,0],[0,1]]) arr2 = np.array([[0,1],[0,1]]) arr3 = np.array([[0,1],[1,0]]) arr4 = np.array([[0,0],[0,1]]) arr5 = np.array([[0,1],[0,0]]) arr_list = [arr1, arr2, arr3, arr4, arr5] unique_arrs = deduplicate_arrays(arr_list) print("二维去重结果:") for arr in unique_arrs: print(arr) # 测试三维数组 arr6 = np.array([[[1,1],[0,2]],[[0,0],[0,0]]]) arr7 = np.array([[[0,0],[0,0]],[[1,1],[0,2]]]) arr8 = np.array([[[0,0],[0,0]],[[0,2],[1,1]]]) arr_list_3d = [arr6, arr7, arr8] unique_arrs_3d = deduplicate_arrays(arr_list_3d) print("\n三维去重结果:") for arr in unique_arrs_3d: print(arr)
该方法可适配任意维度的numpy数组,通过逐层标准化保证结构相同的数组被转换成一致形式,实现准确去重。
内容的提问来源于stack exchange,提问作者UncaughtExceptionConnoisseur
相关产品推荐
相关产品推荐

