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

如何移除二维NumPy数组中为其他行循环或逆序的行?

移除NumPy数组中循环/逆序排列的行

实现思路

核心是给每一行生成唯一的"特征标识",判断该行是否与其他行属于循环或逆序排列的等价组,只保留每组中的一行:

  1. 对每行生成所有可能的循环排列,以及该行逆序后的所有循环排列
  2. 从这些等价排列中选取字典序最小的元组作为该行的唯一标识
  3. 遍历数组,仅保留标识首次出现的行

代码实现

import numpy as np

def remove_equivalent_rows(arr):
    unique_keys = set()
    keep_indices = []
    
    for idx, row in enumerate(arr):
        # 生成当前行的所有循环排列
        cyclic_perms = [np.roll(row, i) for i in range(len(row))]
        # 生成逆序行的所有循环排列
        reversed_row = row[::-1]
        reversed_cyclic_perms = [np.roll(reversed_row, i) for i in range(len(row))]
        # 合并所有等价排列
        all_equivalent = cyclic_perms + reversed_cyclic_perms
        
        # 取字典序最小的元组作为该行的唯一标识
        key = min(tuple(p) for p in all_equivalent)
        
        if key not in unique_keys:
            unique_keys.add(key)
            keep_indices.append(idx)
    
    return arr[keep_indices]

# 测试示例
data = np.array([[1,2,3,4],[2,3,4,1],[4,3,2,1],[1,3,4,2],[2,3,4,5]])
answer = remove_equivalent_rows(data)
print(answer)

结果验证

运行代码后输出与示例一致:

[[1 2 3 4]
 [1 3 4 2]
 [2 3 4 5]]

内容的提问来源于stack exchange,提问作者llj

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 15:40:13