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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 21:45:08