【机器学习】数据清洗——基于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

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

这篇文章到这里就结束了

谢谢大家的阅读!

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

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

相关文章
|
1月前
|
数据采集 数据处理 Python
探索数据科学前沿:Pandas与NumPy库的高级特性与应用实例
探索数据科学前沿:Pandas与NumPy库的高级特性与应用实例
31 0
|
2月前
|
Python
NumPy 教程 之 NumPy 矩阵库(Matrix) 4
矩阵是由行和列构成的矩形数组,其元素可以是数字、符号或数学表达式。
30 4
|
2月前
|
Python
NumPy 教程 之 NumPy 矩阵库(Matrix) 2
不同于ndarray,matlib函数生成的是矩阵形式。教程中详细解释了矩阵的概念,并介绍了转置矩阵的实现方式,使用T属性或函数实现。此外,还展示了如何利用`matlib.empty()`创建指定形状的新矩阵,并可选择数据类型及顺序。最后通过示例演示了矩阵填充随机数据的方法。
33 3
|
2月前
|
机器学习/深度学习 数据处理 Python
从NumPy到Pandas:轻松转换Python数值库与数据处理利器
从NumPy到Pandas:轻松转换Python数值库与数据处理利器
60 0
|
5天前
|
数据采集 数据可视化 数据处理
如何使用Python实现一个交易策略。主要步骤包括:导入所需库(如`pandas`、`numpy`、`matplotlib`)
本文介绍了如何使用Python实现一个交易策略。主要步骤包括:导入所需库(如`pandas`、`numpy`、`matplotlib`),加载历史数据,计算均线和其他技术指标,实现交易逻辑,记录和可视化交易结果。示例代码展示了如何根据均线交叉和价格条件进行开仓、止损和止盈操作。实际应用时需注意数据质量、交易成本和风险管理。
23 5
|
1月前
|
机器学习/深度学习 算法 数据挖掘
【Python篇】深度探索NumPy(下篇):从科学计算到机器学习的高效实战技巧1
【Python篇】深度探索NumPy(下篇):从科学计算到机器学习的高效实战技巧
49 5
|
1月前
|
机器学习/深度学习 算法 数据可视化
【Python篇】深度探索NumPy(下篇):从科学计算到机器学习的高效实战技巧2
【Python篇】深度探索NumPy(下篇):从科学计算到机器学习的高效实战技巧
34 1
|
2月前
|
Python
NumPy 教程 之 NumPy 矩阵库(Matrix) 8
矩阵是由行和列构成的矩形数组,其元素可以是数字、符号或表达式。教程中讲解了如何使用`numpy.matlib.rand()`创建指定大小且元素随机填充的矩阵,并演示了矩阵与ndarray之间的转换方法。此外,还介绍了如何使用T属性进行矩阵转置。示例代码展示了创建矩阵、将其转换为ndarray以及再转回矩阵的过程。
40 9
|
2月前
|
数据挖掘 Python
​Python神奇之旅:探索NumPy库的力量
​Python神奇之旅:探索NumPy库的力量
15 0
|
3月前
|
机器学习/深度学习 存储 算法
NumPy 与 SciPy:Python 科学计算库的比较
【8月更文挑战第30天】
130 5