You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对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]],改变了原本的子数组组成。

解决方案:嵌套层级递归排序

从嵌套列表的角度出发,采用递归逐层标准化的思路:

  1. 先对最深层(第n层)的所有子数组进行排序;
  2. 从第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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 16:52:06