【机器学习】数据清洗——基于Numpy库的方法删除重复点

简介: 【机器学习】数据清洗——基于Numpy库的方法删除重复点



引言:

在进行数据分析和机器学习任务时,经常会遇到数据中包含重复值的情况。处理这些重复值对于保证数据质量和模型性能至关重要。

本文将介绍如何利用 NumPy 库中的功能来删除重复点,包括基于行、列以及全部点的删除方法。

首先,我们将深入了解 NumPy 库中的 numpy.unique() 函数,该函数是处理数据中唯一值的利器,能够快速识别数组中的唯一值并返回相应的索引。

接下来,我们将分别介绍基于行、列和全部点的删除重复值的方法,并提供相应的代码示例和详细解释。

通过学习这些方法,您将能够灵活处理各种数据集中的重复值,为后续的数据分析和建模工作打下坚实的基础。

一 numpy.unique函数介绍

numpy.unique 函数用于在 NumPy 数组中查找唯一值,并返回唯一值数组。它有几个参数可以控制函数的行为,让我们来详细介绍一下这些参数以及 numpy.unique 的功能:

1.1 语法

numpy.unique(ar, return_index=False, 
return_inverse=False, return_counts=False, axis=None)

1.2 参数

ar:输入的数组,可以是任意维度的数组。

return_index:如果设置为True,则返回唯一值数组中的元素在原始数组中的索引,这样你可以通过这些索引获取原始数组中相应的元素。默认为 False。

return_inverse:如果设置为 True,则返回一个整数数组,该数组将原始数组中的每个元素替换为其在唯一值数组中的索引。通过使用此参数,您可以通过索引重构原始数组。默认为 False。

return_counts:如果设置为 True,则返回一个数组,其中包含唯一值数组中的每个元素在原始数组中出现的次数。默认为 False。

axis:指定在哪个轴上查找唯一值。默认为 None,表示将数组展平后查找唯一值。

1.3 返回值

unique_values:唯一值数组。

unique_indices:(可选)唯一值数组中的元素在原始数组中的索引。

unique_inverse:(可选)原始数组中的每个元素在唯一值数组中的索引,用于重构原始数组。

unique_counts:(可选)唯一值数组中的每个元素在原始数组中出现的次数。

1.4 示例

import numpy as np
# 创建一个包含重复元素的数组
data = np.array([1, 2, 3, 1, 2, 4, 5, 6, 3])
# 使用 unique 函数查找唯一值
unique_values = np.unique(data)
print("唯一值数组:", unique_values)
# 返回每个唯一值在原始数组中的索引
unique_indices = np.unique(data, return_index=True)[1]
print("唯一值在原始数组中的索引:", unique_indices)
# 返回原始数组中的每个元素在唯一值数组中的索引
unique_inverse = np.unique(data, return_inverse=True)[1]
print("原始数组中的每个元素在唯一值数组中的索引:", unique_inverse)
# 返回唯一值数组中的每个元素在原始数组中出现的次数
unique_counts = np.unique(data, return_counts=True)[1]
print("唯一值在原始数组中出现的次数:", unique_counts)

代码分析:

这段代码使用NumPy库对一个包含重复元素的数组进行处理。

首先,通过np.unique(data)获取数组中的唯一值,即去除重复值后的数组,并将结果存储在unique_values变量中。

然后,通过np.unique(data,return_index=True)[1]获取每个唯一值在原始数组中的索引,即每个唯一值在原始数组中第一次出现的位置,将结果存储在unique_indices变量中。

接着,通过np.unique(data, return_inverse=True)[1]获取原始数组中的每个元素在唯一值数组中的索引,即原始数组中的每个元素在唯一值数组中的位置,将结果存储在unique_inverse变量中。

最后,通过np.unique(data, return_counts=True)[1]获取唯一值数组中的每个元素在原始数组中出现的次数,将结果存储在unique_counts变量中。

打印这些变量可以提供关于数组中唯一值、其在原始数组中的索引、原始数组元素在唯一值数组中的索引以及唯一值在原始数组中出现次数的信息。

1.5 注意事项

如果需要删除数组中的重复值并保留其顺序,可以使用 return_index=True 和 return_inverse=True,然后根据返回的索引重构数组。

numpy.unique 函数默认会对输入数组进行排序,因此返回的唯一值数组也是排序好的。如果不想排序,可以在调用函数时指定 sort=False 参数。

二 基于行删除重复值

2.1 导入 Numpy 库:

import numpy as np

这行代码导入了 Numpy 库,使我们可以使用其中的函数和数据结构。

2.2 创建包含重复行的数组:

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

这段代码创建了一个多维 Numpy 数组 data,其中包含了一些重复的行。

2.3 使用 numpy.unique() 函数删除重复行后的数组以及唯一行在原始数组中的索引。:

data_row, indices = np.unique(data, axis=0, return_index=True)

在这行代码中,numpy.unique() 函数被调用。

axis=0 参数表示按行进行唯一性检查。

return_index=True 参数使函数返回唯一值的索引。

data_row 变量接收包含唯一行的数组,而 indices 变量接收了这些唯一行在原始数组中的索引。

2.4 对唯一值索引进行排序:

indices = np.sort(indices)

这行代码对唯一行的索引数组 indices 进行排序,为什么要进行排序呢?让我们先看看直接获取的删除重复行的数组。

print(data_row)

输出如下:

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

从输出结果中我们可以看到,虽然重复的行被删除了,但是数组原来的顺序被打乱了,变成了从小到大排序的顺序。

那么如何解决这个问题呢?我们先来看看 indices 变量,即唯一行在原始数组中的索引。

print(indices)

输出结果:

[1 3 0]

从输出结果中,我们可以看到,为[1 3 0],并不是唯一值在原来的数组中对应的索引值,这是因为索引值的排序是按照data_row数组中唯一值的索引值排序的,所以我们只需要将索引从小到大重新排序,然后利用获取的索引重构数组即可。

也可以这么理解,保留顺序后的数组应该是这样的:

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

这个数组中唯一行在原始数组的索引是从小到大排序的,所以想要获取保留顺序的删除重复值的数组,我们需要对唯一值索引进行从小到大的排序,然后再重构。

2.5 根据排序后的索引获取唯一行:

unique_data = data[indices]

这行代码使用排序后的索引数组 indices 来获取删除了重复行的新数组 unique_data。

2.6 打印原始数组和删除重复行并保留顺序后的数组:

print("原数组:", data)
print("删除重复行后的数组:\n", unique_data)

这两行代码打印了原始数组 data 和删除了重复行并保留顺序后的数组 unique_data。

通过这些步骤,代码成功删除了数组中的重复行,并输出了删除重复行后的数组。

输出结果:

原数组: [[7 9 8]
 [1 3 2]
 [1 3 2]
 [5 6 4]]
删除重复行后的数组:
 [[1 3 2]
 [5 6 4]
 [7 9 8]]

2.7 全部代码:

import numpy as np
data = np.array([[7, 9, 8],
                [1, 3, 2],
                 [1, 3, 2],
                 [5, 6, 4]])
data_row,indices = np.unique(data, axis=0, return_index=True)
indices = np.sort(indices)
unique_data = data[indices]
print("原数组:",data)
print("删除重复行后的数组:\n", unique_data)

三 基于列删除重复值

要基于列删除数组中的重复值,可以利用 numpy.unique() 函数,并指定 axis=1 参数。以下是使用 numpy.unique() 函数基于列删除重复值的详细步骤:

3.1 导入 NumPy 库:

import numpy as np

这行代码导入了 NumPy 库并使用别名 np。

3.2 创建包含重复列的数组:

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

创建一个包含3行4列数据的 NumPy 重复列数组 data,第二列和第三列是重复的。

3.3 使用 np.unique() 函数获取唯一列索引:

indices = np.unique(data, axis=1, return_index=True)[1]

使用 np.unique() 函数查找每行中的唯一元素,axis=1 表示按列查找,return_index=True表示返回唯一值在原数组中的第一次出现的索引。indices 变量中。

3.4 对索引进行排序:

indices = np.sort(indices)

使用 NumPy 的 np.sort() 函数对索引数组进行排序,排序的原因在上面解释了,在这里就不解释了。

3.5 对数组进行转置:

data = data.T

对原始数组进行转置,将行变为列,列变为行。

这里为什么要进行转置呢?

为了方便后面的data[indices]语句可以依靠列索引进行重构数组,如果不转置,这条语句会默认将indices作为行索引重构数组,从而发生错乱。

3.6 选择唯一列:

unique_data = data[indices]

使用排序后的索引从转置后的数组中选择唯一的列。

3.7 再次对数组进行转置:

unique_data = unique_data.T

将选择的唯一列再次进行转置,使其恢复为原始的行列布局。

3.8 打印删除重复列并保留顺序后的数组:

print("删除重复列并保留顺序后的数组:\n", unique_data)

打印删除重复列并保留顺序后的数组 unique_data。

输出结果如下:

删除重复列并保留顺序后的数组:
 [[7 1 5]
 [9 3 6]
 [8 2 4]]

从结果中,我们可以看到,重复列被删除了,并且其他列之间保留了原来的排序关系。

3.9 全部代码:

import numpy as np
data = np.array([[7, 1, 1,5],
                [9, 3, 3,6],
                 [8, 2, 2,4],
                ])
data_row,indices = np.unique(data, axis=1, return_index=True)
indices = np.sort(indices)
data = data.T
unique_data = data[indices]
unique_data = unique_data.T
print("删除重复列并保留顺序后的数组:\n", unique_data)

四 基于全部点删除重复值

4.1 导入 NumPy 库:

import numpy as np

这行代码导入了 NumPy 库并使用别名 np。

4.2 创建一个 包含多个重复点的NumPy 数组

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

创建了一个包含4行3列数据的 NumPy 数组 data,这个数组具有多个重复点

4.3获取唯一值的索引:

indices = np.unique(data, return_index=True)[1]

使用 np.unique() 函数找到数组中的唯一值,并返回其在原数组中第一次出现的索引。return_index=True 表示返回索引。

4.4 对索引进行排序:

indices = np.sort(indices)

使用 NumPy 的 np.sort() 函数对索引数组进行排序。

4.5 将数组展平:

data = np.ravel(data)

使用 np.ravel() 函数将原始数组 data 展平为一维数组,因为indices中的索引是针对与一维数组的。

4.6 根据索引获取唯一值:

unique_data = data[indices]

使用排序后的索引从展平后的数组中选择唯一值。

4.7 打印删除所有重复值后的数组:

print("删除所有重复值后的数组:\n", unique_data)

打印删除所有重复值后的数组 unique_data。

输出结果如下:

删除所有重复值后的数组:
 [8 2 9 6 7 3 1 4 5]

从结果中,我们可以看到,所有重复值都被删除了,并且,新的数组保留了原来的顺序。

4.8 全部代码:

import numpy as np
data = np.array([ [8, 2, 9], [6, 7, 3], [1, 3, 4],[1, 5, 2] ])
indices = np.unique(data,  return_index=True)[1]
indices = np.sort(indices)
data = np.ravel(data)
unique_data = data[indices]
print("删除所有重复值后的数组:\n",unique_data)

总结

数据清洗是数据处理过程中不可或缺的一环,而删除重复点则是其中的一个重要步骤。

本文通过介绍基于 NumPy 库的方法,向读者展示了如何高效地删除数据中的重复值,并保留重复值在原始数据中的顺序。

首先,我们学习了 numpy.unique() 函数的用法,了解了其语法、参数、返回值以及注意事项,为后续的操作打下基础。

接着,我们分别介绍了基于行、列和全部点的删除重复值的方法,通过代码示例演示了每种方法的实现步骤,并给出了详细的解释和说明。

通过本文的学习,读者将掌握利用 NumPy

库进行数据清洗的关键技能,能够在实际工作中灵活应用这些方法,提高数据处理的效率和准确性,为后续的数据分析和建模工作奠定坚实的基础。

这篇文章到这里就结束了

谢谢大家的阅读!

如果觉得这篇博客对你有用的话,别忘记三连哦。

我是豌豆射手^,让我们我们下次再见

相关文章
|
19天前
|
机器学习/深度学习 人工智能 数据处理
机器学习库:numpy
机器学习库:numpy
33 0
|
1月前
|
机器学习/深度学习 存储 算法
Python中的NumPy库:数值计算与科学计算的基石
【2月更文挑战第29天】NumPy是Python科学计算的核心库,专注于高效处理大型多维数组和矩阵。其核心是ndarray对象,提供快速数组操作和数学运算,支持线性代数、随机数生成等功能。NumPy广泛应用于数据处理、科学计算和机器学习,简化了矩阵运算、统计分析和算法实现,是数据科学和AI领域的重要工具。
|
1月前
|
数据采集 机器学习/深度学习 Python
【机器学习】数据清洗——基于Pandas库的方法删除重复点
【机器学习】数据清洗——基于Pandas库的方法删除重复点
52 1
|
1月前
|
存储 索引 Python
请解释Python中的NumPy库以及它的主要用途。
【2月更文挑战第27天】【2月更文挑战第97篇】请解释Python中的NumPy库以及它的主要用途。
|
10天前
|
机器学习/深度学习 数据采集 算法
探索NumPy与机器学习库的集成之路
【4月更文挑战第17天】本文探讨了NumPy在机器学习中的核心作用,它为各类机器学习库提供基础数据处理和数值计算能力。NumPy的线性代数、优化算法和随机数生成等功能,对实现高效模型训练至关重要。scikit-learn等库广泛依赖NumPy进行数据预处理。未来,尽管面临大数据和复杂模型的性能挑战,NumPy与机器学习库的集成将继续深化,推动技术创新。
|
10天前
|
搜索推荐 数据挖掘 数据处理
NumPy数组统计与排序方法全览
【4月更文挑战第17天】本文介绍了NumPy在Python中的数组统计和排序功能。主要包括计算平均值、标准差和方差的`np.mean()`, `np.std()`, `np.var()`方法,以及求最大值、最小值、百分位数的功能。在排序方面,讲解了基本排序的`np.sort()`,获取排序索引的`np.argsort()`,逆序排序和随机排序的方法。这些工具对于数据分析和科学计算十分实用,能有效提升数据处理效率。
|
1月前
|
Python
Numpy(Numerical Python)是一个用于处理大型多维数组和矩阵的Python库
【2月更文挑战第28天】Numpy(Numerical Python)是一个用于处理大型多维数组和矩阵的Python库
21 1
|
1月前
|
机器学习/深度学习 存储 搜索推荐
利用机器学习算法改善电商推荐系统的效率
电商行业日益竞争激烈,提升用户体验成为关键。本文将探讨如何利用机器学习算法优化电商推荐系统,通过分析用户行为数据和商品信息,实现个性化推荐,从而提高推荐效率和准确性。
|
23天前
|
机器学习/深度学习 算法 搜索推荐
Machine Learning机器学习之决策树算法 Decision Tree(附Python代码)
Machine Learning机器学习之决策树算法 Decision Tree(附Python代码)
|
1月前
|
机器学习/深度学习 数据采集 算法
解码癌症预测的密码:可解释性机器学习算法SHAP揭示XGBoost模型的预测机制
解码癌症预测的密码:可解释性机器学习算法SHAP揭示XGBoost模型的预测机制
116 0