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

news2025/1/12 15:57:07

在这里插入图片描述

🎈个人主页:豌豆射手^
🎉欢迎 👍点赞✍评论⭐收藏
🤗收录专栏:机器学习
🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进步!

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

  • 一 numpy.unique函数介绍
    • 1.1 语法
    • 1.2 参数
    • 1.3 返回值
    • 1.4 示例
    • 1.5 注意事项
  • 二 基于行删除重复值
    • 2.1 导入 Numpy 库:
    • 2.2 创建包含重复行的数组:
    • 2.3 使用 numpy.unique() 函数删除重复行后的数组以及唯一行在原始数组中的索引。:
    • 2.4 对唯一值索引进行排序:
    • 2.5 根据排序后的索引获取唯一行:
    • 2.6 打印原始数组和删除重复行并保留顺序后的数组:
    • 2.7 全部代码:
  • 三 基于列删除重复值
    • 3.1 导入 NumPy 库:
    • 3.2 创建包含重复列的数组:
    • 3.3 使用 np.unique() 函数获取唯一列索引:
    • 3.4 对索引进行排序:
    • 3.5 对数组进行转置:
    • 3.6 选择唯一列:
    • 3.7 再次对数组进行转置:
    • 3.8 打印删除重复列并保留顺序后的数组:
    • 3.9 全部代码:
  • 四 基于全部点删除重复值
    • 4.1 导入 NumPy 库:
    • 4.2 创建一个 包含多个重复点的NumPy 数组
    • 4.3获取唯一值的索引:
    • 4.4 对索引进行排序:
    • 4.5 将数组展平:
    • 4.6 根据索引获取唯一值:
    • 4.7 打印删除所有重复值后的数组:
    • 4.8 全部代码:
  • 总结

在这里插入图片描述

引言:

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

本文将介绍如何利用 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
库进行数据清洗的关键技能,能够在实际工作中灵活应用这些方法,提高数据处理的效率和准确性,为后续的数据分析和建模工作奠定坚实的基础。

这篇文章到这里就结束了

谢谢大家的阅读!

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

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

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1459516.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Github 2024-02-16 开源项目日报 Top9

根据Github Trendings的统计,今日(2024-02-16统计)共有9个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目4TypeScript项目3Rust项目3Jupyter Notebook项目1JavaScript项目1 Black:不妥协的Pytho…

并发编程-ReentrantLock 与 ReentrantReadWriteLock(可重入锁,独享锁,公平与非公平锁,读写锁)

AQS实现原理 前期准备 AQS(全称AbstractQueuedSynchronizer)即队列同步器。它是构建锁或者其他同步组件的基础框架(如ReentrantLock、ReentrantReadWriteLock、Semaphore等)。 整体概览类图 AbstractQueuedSynchronizer类图 …

汽车控制器软件正向开发

需求常见问题: 1.系统需求没有分层,没有结构化,依赖关系不明确 2.需求中没有验证准则 3.对客户需求的追溯缺失,不完整,颗粒度不够 4.系统需求没有相应的系统架构,需求没有分解到硬件和软件 5.需求变更管控不严格,变更频繁,变更纪录描述不准确,有遗漏,客户需求多…

【MySQL】如何处理DB读写分离数据不一致问题?

文章内容 1、前言读写库数据不一致问题我们如何解决?方案一:利用数据库自身特性方案二:不解决方案三:客户端保存法方案四:缓存标记法方案五:本地缓存标记 那DB读写分离情况下,如何解决缓存和数据…

STM32F1X RS485使用DMA发送丢失数据的处理方法。

串口通过DMA发送一帧数据时总是缺少2个字节,且最后一个字节数据为0xff的原因及解决方法 本次记录为采用485串口发送数据,发送模式是循环检测串口数据寄存器为空(TXE)和发送完成标志位(TC)。DMA发送串口方式…

基于java,springboot和vue房屋租赁租房销售平台设计

摘要 在现代城市生活中,房屋租赁市场一直是一个活跃且复杂的领域。随着互联网技术的不断发展,基于Spring Boot和Vue的房屋租赁系统应运而生,旨在提供一个高效、方便、可靠的在线服务平台。该系统利用了前后端分离架构的优势,后端…

【嵌入式学习】QT-Day1-Qt基础

笔记 https://lingjun.life/wiki/EmbeddedNote/20QT 毛玻璃登录界面实现:

模式匹配这么好,Java语法里有吗?

这篇文章我们借助新版Java来理解模式匹配,Rust版的模式匹配稍后就端上来,各位先尝尝Java这杯老咖啡还香不香😄。 什么是模式匹配? 下图直观的表达了模式匹配的概念。 所谓模式类似上图中木盒的各种形状的洞洞,我们…

UG NX二次开发(C#)-PMI-获取PMI尺寸数据

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 1、前言2、在UG NX的三维模型中添加PMI尺寸信息3、采用二次开发获取尺寸数据4、测试结果1、前言 PMI(Product and Manufacturing Information)是产品和制造信息的简称,主要用于将产品部件设计的…

工具分享:在线键盘测试工具

在数字化时代,键盘作为我们与计算机交互的重要媒介之一,其性能和稳定性直接影响到我们的工作效率和使用体验。为了确保键盘的每个按键都能正常工作,并帮助用户检测潜在的延迟、连点等问题,一款优质的在线键盘测试工具显得尤为重要…

智能运维乱象有哪些?智能运维业务包括哪些

在实施智能运维过程中可能遇到的乱象及其原因,系统地阐述智能运维业务所涵盖的各个方面,包括但不限于预防性维护、故障检测与诊断、自动化修复以及持续的性能优化等关键组成部分。 实施智能运维过程中可能遇到的乱象及原因包括: 数据不一致或…

Qt|大小端数据转换(补充)

Qt|大小端数据转换-CSDN博客 之前这篇文章大小端数据转换如果是小数就会有问题。 第一个方法&#xff1a; template <typename T> static QByteArray toData(const T &value, bool isLittle) {QByteArray data;for (int i 0; i < sizeof(T); i) {int bitOffset…

小米14 ULTRA:重新定义手机摄影的新篇章

引言 随着科技的飞速发展&#xff0c;智能手机已经不仅仅是一个通讯工具&#xff0c;它更是我们生活中的一位全能伙伴。作为科技领域的佼佼者&#xff0c;小米公司再次引领潮流&#xff0c;推出了全新旗舰手机——小米14 ULTRA。这款手机不仅在性能上进行了全面升级&am…

电脑文件msvcr110.dll缺失的多种解决方法,msvcr110.dll文件修复手段

遭遇"程序无法启动&#xff0c;因为电脑中缺失msvcr110.dll"这样的错误提示&#xff0c;是Windows操作系统用户可能会遇到的一种情况。尽管这种现象在一些用户中较为常见&#xff0c;但解决这一问题并非复杂的过程。本文将深入剖析此问题&#xff0c;并分享一些实用的…

2.16日学习打卡----初学Dubbo(一)

2.16日学习打卡 目录: 2.16日学习打卡一. 什么是分布式&#xff1f;二. 什么是RPC?三. Dubbo概念_简介四. Dubbo核心组件五.Dubbo配置开发环境六. Dubbo配置开发环境_管理控制台 一. 什么是分布式&#xff1f; 可以看我的这篇文章–2.14日学习打卡----初学Zookeeper(一) 二.…

【设计模式】23种设计模式笔记

设计模式分类 模板方法模式 核心就是设计一个部分抽象类。 这个类具有少量具体的方法&#xff0c;和大量抽象的方法&#xff0c;具体的方法是为外界提供服务的点&#xff0c;具体方法中定义了抽象方法的执行序列 装饰器模式 现在有一个对象A&#xff0c;希望A的a方法被修饰 …

Android挖取原图中心区域RectF(并框线标记)放大到ImageView宽高,Kotlin

Android挖取原图中心区域RectF(并框线标记)放大到ImageView宽高&#xff0c;Kotlin 红色线框区域即为选中的原图中心区域&#xff0c;放大后放到等宽高的ImageView里面。 import android.content.Context import android.graphics.Bitmap import android.graphics.BitmapFactor…

Mybatis | 初识Mybatis

初识Mybatis 目录: 初识Mybatis什么是Mybatis&#xff1f;Hibernate 和 MyBatis的区别&#xff1f;Mybatis的下载和使用Mybatis的工作原理 作者简介 &#xff1a;一只大皮卡丘&#xff0c;计算机专业学生&#xff0c;正在努力学习、努力敲代码中! 让我们一起继续努力学习&#…

牛客网 OR141 密码检查

答案&#xff1a; #include <stdio.h> #include <string.h> #include <ctype.h> int main() {int n 0;int count1 0, count2 0, count3 0;scanf("%d", &n);while (n--){char ch[100];scanf("%s", ch);int len strlen(ch);if (…

UE5 C++ UENUM 和 USTRUCT

一.首先在APawn里声明 UENUM 和 USTRUCT。UENUM 有两种定义方式 一种是使用命名空间&#xff1a; 还有是继承uint8&#xff1a; 通过申明class类 别名来替代 USTRUCT的定义 上面的第二种有类似但仍然有很多的差异&#xff1a; 首先要有GENERATED_USTRUCT_BODY()这个函数 并且…