如何移除二维NumPy数组中为其他行循环或逆序的行?
移除NumPy数组中循环/逆序排列的行
实现思路
核心是给每一行生成唯一的"特征标识",判断该行是否与其他行属于循环或逆序排列的等价组,只保留每组中的一行:
- 对每行生成所有可能的循环排列,以及该行逆序后的所有循环排列
- 从这些等价排列中选取字典序最小的元组作为该行的唯一标识
- 遍历数组,仅保留标识首次出现的行
代码实现
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
相关产品推荐
相关产品推荐

