8.3 去重与重复处理
NumPy去重与重复处理教程 | 详解np.unique(), np.repeat(), np.tile(), np.bincount()函数
本教程详细讲解NumPy中的去重与重复处理方法,涵盖np.unique()去重计数、np.repeat()和np.tile()重复元素、np.bincount()统计频率以及去除邻接重复值,帮助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数据科学项目的效率。建议结合实践练习,加深理解。
开发工具推荐