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

如何获取NumPy数组的唯一行并保留其首次出现顺序?

获取Numpy数组的唯一行并保留首次出现顺序

你目前的代码想要提取数组的唯一行,但最终输出了一维数组,完全没实现行去重的需求——原代码逻辑存在错误,只是把所有行都扁平化追加到了结果里。下面分析问题并给出可行方案:

原代码的问题

  • 初始unique是空数组,np.array_equal(unique, i)永远返回False,导致所有行都会被追加
  • 用np.append(..., axis=None)会把数组扁平化,最后得到一维结果
  • 根本没检查当前行是否已经在已收集的唯一行里,只是拿整个unique数组和单行比较,逻辑完全不对

解决方案

方法1:用Python列表手动跟踪唯一行(直观易懂)

import numpy as np

arr = np.array([[1,2,3,4,5],[3,4,5,6,7],[5,6,7,8,9],[7,8,9,0,1],[9,0,1,2,3],[1,2,3,4,5],[-8,-7,-6,-5,-4]])
unique_rows = []

for row in arr:
    # 把数组行转成元组(数组不可哈希,没法直接放集合判断)
    row_tuple = tuple(row)
    # 检查该行是否已经在唯一行列表里
    if row_tuple not in [tuple(r) for r in unique_rows]:
        unique_rows.append(row)

unique_arr = np.array(unique_rows)
print(unique_arr)

输出结果:

[[ 1  2  3  4  5]
 [ 3  4  5  6  7]
 [ 5  6  7  8  9]
 [ 7  8  9  0  1]
 [ 9  0  1  2  3]
 [-8 -7 -6 -5 -4]]

方法2:用Numpy结构化数组实现高效去重(适合大型数组)

如果处理的是大数据量,这种方法比列表遍历更快:

import numpy as np

arr = np.array([[1,2,3,4,5],[3,4,5,6,7],[5,6,7,8,9],[7,8,9,0,1],[9,0,1,2,3],[1,2,3,4,5],[-8,-7,-6,-5,-4]])

# 把二维数组转成结构化数组,让每一行变成一个可哈希的整体
structured = arr.view(np.dtype((np.void, arr.dtype.itemsize * arr.shape[1])))
# 获取唯一值的首次出现索引
_, unique_indices = np.unique(structured, return_index=True)
# 按索引排序后提取原数组的行
unique_arr = arr[np.sort(unique_indices)]

print(unique_arr)

输出和方法1一致。

方法3:用Pandas快速去重(已引入Pandas的场景)

如果项目里已经在用Pandas,一行代码就能搞定:

import numpy as np
import pandas as pd

arr = np.array([[1,2,3,4,5],[3,4,5,6,7],[5,6,7,8,9],[7,8,9,0,1],[9,0,1,2,3],[1,2,3,4,5],[-8,-7,-6,-5,-4]])

# 转DataFrame后去重,保留首次出现的行
unique_arr = pd.DataFrame(arr).drop_duplicates(keep='first').to_numpy()
print(unique_arr)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 06:11:27