在2D numpy数组或pandas DataFrame中查找移除互为回文的行对
解决方案
1. Numpy 向量化方案(中小规模矩阵最优)
完全基于Numpy内置向量化操作实现,无Python层面显式循环,执行效率极高:
import numpy as np # 示例输入矩阵 arr = np.array([ [1,2,3], [4,5,6], [3,2,1], [7,8,9], [9,8,7], [5,5,5] # 自身为回文的单独行不会被误删 ]) # 生成所有行反转后的矩阵 reversed_rows = arr[:, ::-1] # 广播对比得到所有行对的匹配结果:mask[i,j]为True代表第i行等于第j行的反转 pair_match_mask = (arr[:, None] == reversed_rows).all(axis=-1) # 取上三角匹配结果避免重复配对,仅标记每个回文对的第二个实例为待删除项 to_delete_idx = np.where(np.triu(pair_match_mask, k=1).any(axis=0))[0] # 删除目标行得到结果 result = np.delete(arr, to_delete_idx, axis=0)
2. Pandas 优雅实现
代码可读性更高,适合需要同时进行表格类操作的场景:
import pandas as pd df = pd.DataFrame(arr) # 将每行转为可哈希的元组作为标识 row_keys = df.apply(tuple, axis=1) reversed_row_keys = row_keys.apply(lambda x: x[::-1]) # 标记反转标识已经出现过的行作为待删除项 to_delete = reversed_row_keys.duplicated(keep='first') result_df = df[~to_delete]
3. 超大规模矩阵优化方案
如果矩阵行数过万,上述向量化方案会产生O(n²)的内存开销,可改用线性复杂度的哈希表方案,仅需遍历一次矩阵:
seen = set() result_rows = [] for row in arr: row_tuple = tuple(row) reversed_tuple = row_tuple[::-1] if reversed_tuple not in seen: result_rows.append(row) seen.add(row_tuple) result = np.array(result_rows)
该方案时间复杂度为O(n*m)(n为行数,m为列数),空间复杂度为O(n),内存占用远低于向量化方案。
注意事项
- 自身为回文的单独行不会被删除,若需要删除重复的自回文行,可在上述逻辑基础上额外增加去重逻辑即可。
- 所有方案均避免了嵌套循环操作,性能远高于直观的手写for-loop实现。
内容的提问来源于stack exchange,提问作者Aisec Nory
相关产品推荐
相关产品推荐

