如何获取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
相关产品推荐
相关产品推荐

