NumPy 中文教程

第一部分:基础认知与环境准备
第 1 章 全面认识 NumPy
第 2 章 开发环境搭建与验证
第二部分:核心对象 ——ndarray 数组
第 3 章 ndarray 数组基础
第 4 章 数组的形状与维度操作
第四部分:高级应用与数据处理
第 8 章 数组的排序、查找与去重
第 9 章 缺失值与异常值处理
第 10 章 随机数生成与抽样
第 11 章 文件读写与数据交互
第五部分:实战场景与落地应用
第 12 章 数值计算实战
第 13 章 数据分析实战
第六部分:优化进阶与问题解决
第 14 章 NumPy 性能优化
第 15 章 NumPy 进阶扩展
第 16 章 常见问题与解决方案

8.3 去重与重复处理

NumPy去重与重复处理教程 | 详解np.unique(), np.repeat(), np.tile(), np.bincount()函数

NumPy 中文教程

本教程详细讲解NumPy中的去重与重复处理方法,涵盖np.unique()去重计数、np.repeat()和np.tile()重复元素、np.bincount()统计频率以及去除邻接重复值,帮助Python数据科学新手高效处理数组数据。

推荐工具
PyCharm专业版开发必备

功能强大的Python IDE,提供智能代码补全、代码分析、调试和测试工具,提高Python开发效率。特别适合处理列表等数据结构的开发工作。

了解更多

NumPy去重与重复处理教程

简介

NumPy(Numerical Python)是Python中最流行的科学计算库之一,专注于高效的多维数组(ndarray)操作。在数据分析和预处理中,去重和重复处理是常见任务,NumPy提供了多个函数来简化这些操作。本教程将深入讲解NumPy中的去重(np.unique())、计数、元素重复(np.repeat()和np.tile())、重复元素统计(np.bincount())以及邻接重复值去除方法,配有详细示例和易懂解释,适合初学者快速上手。

1. 去重与计数:np.unique()

np.unique() 是NumPy中用于去重和统计的核心函数,它可以返回输入数组中的唯一值,并可选地提供计数、索引等信息。

基本用法

  • 语法:numpy.unique(arr, return_index=False, return_inverse=False, return_counts=False)
    • arr: 输入数组
    • return_index: 如果为True,返回唯一值在原数组中的第一个出现的索引
    • return_inverse: 如果为True,返回一个数组,表示原数组中每个元素在唯一值数组中的索引
    • return_counts: 如果为True,返回每个唯一值的出现次数

示例代码

import numpy as np

# 创建一个包含重复元素的数组
arr = np.array([1, 2, 2, 3, 3, 3, 4])

# 只返回唯一值
unique_values = np.unique(arr)
print("Unique values:", unique_values)  # 输出: [1 2 3 4]

# 返回唯一值、第一个出现的索引、逆索引和计数
unique_values, indices, inverse_indices, counts = np.unique(arr, return_index=True, return_inverse=True, return_counts=True)
print("Unique values:", unique_values)        # 输出: [1 2 3 4]
print("Indices:", indices)                     # 输出: [0 1 3 6]   # 1在索引0、2在索引1等
print("Inverse indices:", inverse_indices)     # 输出: [0 1 1 2 2 2 3]  # 每个元素对应唯一值的索引
print("Counts:", counts)                       # 输出: [1 2 3 1]   # 1出现1次、2出现2次等

解释

  • np.unique() 默认返回排序后的唯一值数组。
  • 通过设置参数,可以轻松获取额外信息,如计数用于数据分析,索引用于后续处理。
  • 适用于一维和多维数组的去重,对于多维数组,它返回展平后的唯一值。

2. 元素重复:np.repeat() 和 np.tile()

np.repeat()np.tile() 用于重复数组中的元素或整个数组,生成新数组。

np.repeat()

  • 语法:numpy.repeat(arr, repeats, axis=None)
    • arr: 输入数组
    • repeats: 整数或整数数组,指定每个元素的重复次数
    • axis: 沿着哪个轴重复(对于多维数组)
  • 功能:重复数组中的每个元素指定次数。

np.tile()

  • 语法:numpy.tile(arr, reps)
    • arr: 输入数组
    • reps: 整数或元组,指定重复次数
  • 功能:重复整个数组指定次数(沿各轴)。

示例代码

import numpy as np

arr = np.array([1, 2, 3])

# np.repeat() 示例
repeated = np.repeat(arr, 2)  # 每个元素重复2次
print("Repeated array:", repeated)  # 输出: [1 1 2 2 3 3]

# 使用轴参数(适用于多维数组)
arr_2d = np.array([[1, 2], [3, 4]])
repeated_axis = np.repeat(arr_2d, 2, axis=0)  # 沿着行重复(axis=0)
print("Repeated along axis 0:\n", repeated_axis)  # 输出: [[1 2] [1 2] [3 4] [3 4]]

# np.tile() 示例
tiled = np.tile(arr, 2)  # 整个数组重复2次
print("Tiled array:", tiled)  # 输出: [1 2 3 1 2 3]

# 多维数组的tile
arr_small = np.array([1, 2])
tiled_multi = np.tile(arr_small, (2, 3))  # 在行方向重复2次,列方向重复3次
print("Tiled multi-dim array:\n", tiled_multi)  # 输出: [[1 2 1 2 1 2] [1 2 1 2 1 2]]

解释

  • np.repeat() 适合对单个元素进行重复,常用于创建序列或扩展数据。
  • np.tile() 适合重复整个模式,适合在网格或矩阵中复制数据。
  • 轴参数使这些函数在二维或多维数据中更加灵活。

3. 重复元素统计:np.bincount()

np.bincount() 用于统计非负整数数组中每个值的出现次数,比 np.unique() 的计数部分更高效但限制更多。

基本用法

  • 语法:numpy.bincount(arr, weights=None, minlength=0)
    • arr: 输入数组,必须是非负整数(0到正无穷)
    • weights: 可选权重数组,用于加权计数
    • minlength: 输出数组的最小长度
  • 输出:一个整数数组,索引对应输入值,值对应计数。

示例代码

import numpy as np

arr = np.array([0, 1, 1, 2, 2, 2, 3])
counts = np.bincount(arr)
print("Bincount:", counts)  # 输出: [1 2 3 1]  # 索引0出现1次、索引1出现2次、索引2出现3次、索引3出现1次

# 使用权重
weights = np.array([0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5])
weighted_counts = np.bincount(arr, weights=weights)
print("Weighted bincount:", weighted_counts)  # 输出: [0.5 2.5 7.5 3.5]  # 加权求和

解释

  • np.bincount() 只能处理非负整数,输入值为索引,输出为计数或加权和。
  • np.unique()return_counts=True 更高效,但适用范围更窄。
  • 常用于分类任务或直方图计算。

4. 邻接重复值去除

NumPy没有内置函数直接去除邻接重复值(即删除连续重复的元素),但可以通过其他方法实现。常用方法是使用 np.diff() 检测差异并过滤。

实现方法

  • 使用 np.diff() 计算相邻元素的差异,差异非零的位置表示值发生变化。
  • 结合索引操作,去除连续的重复元素。

示例代码

import numpy as np

def remove_adjacent_duplicates(arr):
    """
    去除数组中的邻接重复值。
    参数: arr - 输入数组
    返回: 去除了连续重复值的新数组
    """
    if len(arr) == 0:
        return arr  # 处理空数组
    # 计算相邻元素的差异
    diff = np.diff(arr)
    # 找出差异非零的索引(即值改变的位置)
    non_zero_indices = np.where(diff != 0)[0]
    # 保留第一个元素和所有非零差异后的元素
    result = arr[np.concatenate(([0], non_zero_indices + 1))]
    return result

# 测试
arr = np.array([1, 2, 2, 3, 3, 4, 4, 5])
filtered = remove_adjacent_duplicates(arr)
print("Original array:", arr)        # 输出: [1 2 2 3 3 4 4 5]
print("After removing adjacent duplicates:", filtered)  # 输出: [1 2 3 4 5]

# 处理多维数组(展平后处理)
arr_2d = np.array([[1, 2], [2, 3], [3, 4]])
flattened = arr_2d.flatten()  # 先展平为一维
filtered_flat = remove_adjacent_duplicates(flattened)
print("Filtered flattened array:", filtered_flat)  # 输出: [1 2 3 4]

解释

  • 此方法适用于一维数组;对于多维数组,可以先展平再处理,或根据需要沿特定轴操作。
  • 实际应用中,可能需要处理特定轴上的邻接重复,但NumPy无直接支持,需自定义函数。
  • 常用于时间序列去噪或数据清洗。

总结

本教程详细介绍了NumPy中去重与重复处理的函数:

  • np.unique() 用于去重、计数和索引,是最通用的去重工具。
  • np.repeat()np.tile() 用于重复元素或整个数组,适用于数据扩展。
  • np.bincount() 用于高效统计非负整数的频率,适合分类数据处理。
  • 邻接重复值去除可以通过 np.diff() 实现,增强数据清洁度。

通过掌握这些函数,您可以高效地处理数组数据,提升Python数据科学项目的效率。建议结合实践练习,加深理解。

开发工具推荐
Python开发者工具包

包含虚拟环境管理、代码格式化、依赖管理、测试框架等Python开发全流程工具,提高开发效率。特别适合处理复杂数据结构和算法。

获取工具包