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

如何剔除NumPy数组中重复元素的首次出现项?

处理NumPy数组:删除重复元素的首次出现,保留后续项

一维数组处理

针对一维数组(如示例[1,2,3,4,5,1,3,5,5]),可以通过统计元素出现次数、标记首次出现位置来筛选目标元素:

import numpy as np

# 示例一维数组
arr = np.array([1,2,3,4,5,1,3,5,5])

# 标记每个元素的首次出现位置
_, first_indices = np.unique(arr, return_index=True)
is_first_occurrence = np.zeros(arr.shape, dtype=bool)
is_first_occurrence[first_indices] = True

# 统计每个元素的出现次数
unique_vals, counts = np.unique(arr, return_counts=True)
count_map = dict(zip(unique_vals, counts))
element_counts = np.array([count_map[val] for val in arr])

# 生成筛选掩码:保留「仅出现一次的元素」或「非首次出现的重复元素」
mask = (element_counts == 1) | (~is_first_occurrence)
result = arr[mask]

print(result)  # 输出: [2 4 1 3 5 5]

二维数组处理

如果是二维数组(如示例[[14093, 'JRp1kX'], [140615, 'JRp1kX'], ...]),需先将每行转为可哈希的元组,再按相同逻辑处理:

import numpy as np

# 示例二维数组(注意dtype=object以兼容不同类型元素)
final = np.array([
    [14093, 'JRp1kX'],
    [140615, 'JRp1kX'],
    [123, 'abc'],
    [456, 'def'],
    [123, 'abc']
], dtype=object)

# 将每行转换为元组,方便重复判断
row_tuples = [tuple(row) for row in final]

# 标记每行的首次出现位置
_, first_indices = np.unique(row_tuples, return_index=True)
is_first_row = np.zeros(final.shape[0], dtype=bool)
is_first_row[first_indices] = True

# 统计每行的出现次数
unique_rows, counts = np.unique(row_tuples, return_counts=True)
count_map = dict(zip(unique_rows, counts))
row_counts = np.array([count_map[row] for row in row_tuples])

# 生成筛选掩码并获取结果
mask = (row_counts == 1) | (~is_first_row)
result = final[mask]

print(result)
# 输出:
# [[140615 'JRp1kX']
#  [456 'def']
#  [123 'abc']]

优化说明

如果处理超大型数组,避免使用列表推导式生成element_counts或row_counts,可改用向量化赋值提升效率:

# 一维数组的向量化统计方式
element_counts = np.zeros_like(arr)
for val, cnt in zip(unique_vals, counts):
    element_counts[arr == val] = cnt

内容的提问来源于stack exchange,提问作者Anthony J. B.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 01:01:17