手把手教你学numpy,从此数据处理不再慌【三】
本文始发于个人公众号:TechFlow,原创不易,求个关注
今天是numpy专题的第三篇,我们来聊聊numpy当中的索引。
上篇的末尾其实我们简单地提到了索引,但是没有过多深入。没有过多深入的原因也很简单,因为numpy当中关于索引的用法实在是很多,并不是我们想的那样用一个下标去获取数据就完事了。
所以我整理了一下相关的用法,把关于索引的使用简单分成了几类,我们一个一个来看。
切片索引
切片我们都熟悉,用冒号将两个数隔开,表示一个区间的上界和下界。通过这种方式访问这个区间内的所有元素。
这一点我们之前介绍过,我们简单回顾一下。
这是一维数组的切片,既然一维数组可以切片,那么同样高维数组也可以切片。我们来看一个二维的数组的切片:
我们生成了一个3 x 4的二维数组,然后通过切片获取了它的1-2数据。由于我们是对行切片,默认保留这一行的所有数据。
如果我们并不需要所有数据,而是只需要某一列的固定数据,可以写成这样:
这一行代码的意思是对于行我们获取1-3行固定第二列的数据,我们用表格表示的话大概是下面这个样子:
我们也可以对两个维度同时切片,这样可以得到更加复杂的数据:
这样切片获得的数据大概是这样的:
也就是说在numpy的数组当中各个维度是分开的,每一个维度都支持切片。我们可以根据我们的需要切片或者是固定下标来获取我们想要的切片。
bool型索引
numpy当中还有一个非常好用的索引方式叫做bool型索引。前文介绍广播的时候曾经介绍过,当我们将两个大小不一致的数组进行计算的时候,numpy会自动帮我们将它们广播成大小一致的情况再进行运算。
而逻辑判断其实也是一种运算,所以如果我们将逻辑运算应用在numpy数组上的话同样会得到一个numpy数组,只不过是bool类型的numpy数组。
我们来看一个例子:
我们创建了一个numpy的数组,然后将它和整数4进行比较,numpy会将这个运算广播到其中每一个元素当中,然后返回得到一个bool类型的numpy数组。
这个bool类型的数组可以作为索引,传入另外一个数组当中,只有bool值为true的行才会被保留。
我们发现只有第4行和第6行的数据被保留了,也就是bool值为true的行号被保留了。这是非常有用的数据获取方式,我们可以直接将判断条件放入索引当中进行数据的过滤,如果应用熟练了会非常方便。
再举个例子,假如我们要根据二维数据的第一列的数据进行过滤,仅仅保留第一列数据大于0.5的。如果按照传统的方法我们需要用一个循环去过滤,但是使用bool类型索引,我们可以只需要一行搞定:
arr[arr[:, 0] > 0.5]
如果有多个条件,我们可以用位运算的与或非进行连接。在Python当中位运算的与或非分别用符号&, |, ~表示。
举个例子,比如我们想要筛选出arr数组当中第1列大于0.5,并且第二列小于0.5的数据,我们可以写成这样:
arr[(arr[:, 0] > 0.5) & (arr[:, 1] < 0.5)]
如果我们想求这个条件的相反条件,我们当然可以将判断条件反过来写,但是也可以通过~符号直接取反:
arr[~((arr[:, 0] > 0.5) & (arr[:, 1] < 0.5))]
花式索引
除了bool索引之外,numpy当中还支持一种花式索引。
所谓的花式索引,意思是说支持将另外一个数组当做是索引来访问数据。
举个很简单的例子:
从上面的例子我们可以看出来,我们把idx这个数组当中的值当做了索引进行了数据的访问。并且有重复值也没有关系,numpy不会进行去重。
通过数组访问数据有什么用呢?其实非常有用,在我们做机器学习的过程当中,我们经常涉及到一个采样的问题。我们每次训练并不是全量的数据,否则非常慢,有时候甚至是不可能完成的,因为数据量太大了。我们往往是抽取出一批数据作为一个batch来训练的,这个在之前批量梯度下降的文章当中曾经提到过。
那么一个batch的数据是怎么抽取的呢?就是这样抽取的,我们会调用np中的一个函数叫做choice,我们用它来从所有样本的下标当中抽取我们指定数量的下标。
有了下标数组之后,我们用一下花式索引就可以拿到对应的全部数据了,如果你看过大牛写的深度学习的代码,里面几乎都是这样实现的。
总结
今天关于numpy当中索引的使用和介绍就到这里,仅仅看介绍可能感受并不明显。但如果上手用numpy做过一次数据处理和实现过机器学习的模型,相信一定可以感受到它的易用性和强大的功能。索引这个功能非常常用,也非常重要,在后序的pandas库当中同样沿用了numpy中对于索引的设定和功能。因此这既是重要的基本功,也是为后面的学习打基础。
如果喜欢本文,可以的话,请点个关注,给我一点鼓励,也方便获取更多文章。
手把手教你学numpy,从此数据处理不再慌【三】的更多相关文章
- 手把手教你学Numpy,从此处理数据不再慌「一」
当当当,我又开新坑了,这次的专题是Python机器学习中一个非常重要的工具包,也就是大名鼎鼎的numpy. 所以今天的文章是Numpy专题的第一篇. 俗话说得好,机器学习要想玩的溜,你可以不会写Pyt ...
- 手把手带你入门numpy,从此数据处理不再慌【四】
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是numpy专题的第四篇文章,numpy中的数组重塑与三元表达式. 首先我们来看数组重塑,所谓的重塑本质上就是改变数组的shape.在保 ...
- 手把手教你学Numpy,搞定数据处理——收官篇
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是Numpy专题第6篇文章,我们一起来看看Numpy库当中剩余的部分. 数组的持久化 在我们做机器学习模型的研究或者是学习的时候,在完成 ...
- 手把手教你学Numpy,这些api不容错过
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是Numpy专题的第5篇文章,我们来继续学习Numpy当中一些常用的数学和统计函数. 基本统计方法 在日常的工作当中,我们经常需要通过一 ...
- 30分钟手把手教你学webpack实战
30分钟手把手教你学webpack实战 阅读目录 一:什么是webpack? 他有什么优点? 二:如何安装和配置 三:理解webpack加载器 四:理解less-loader加载器的使用 五:理解ba ...
- 每天记录一点:NetCore获得配置文件 appsettings.json vue-router页面传值及接收值 详解webpack + vue + node 打造单页面(入门篇) 30分钟手把手教你学webpack实战 vue.js+webpack模块管理及组件开发
每天记录一点:NetCore获得配置文件 appsettings.json 用NetCore做项目如果用EF ORM在网上有很多的配置连接字符串,读取以及使用方法 由于很多朋友用的其他ORM如S ...
- NN入门,手把手教你用Numpy手撕NN(三)
NN入门,手把手教你用Numpy手撕NN(3) 这是一篇包含极少数学的CNN入门文章 上篇文章中简单介绍了NN的反向传播,并利用反向传播实现了一个简单的NN,在这篇文章中将介绍一下CNN. CNN C ...
- 手把手教你学Dapr - 3. 使用Dapr运行第一个.Net程序
上一篇:手把手教你学Dapr - 2. 必须知道的概念 注意: 文章中提到的命令行工具即是Windows Terminal/PowerShell/cmd其中的一个,推荐使用Windows Termin ...
- 手把手教你学Dapr - 4. 服务调用
上一篇:手把手教你学Dapr - 3. 使用Dapr运行第一个.Net程序 介绍 通过使用服务调用,您的应用程序可以使用标准的gRPC或HTTP协议与其他应用程序可靠.安全地通信. 为什么不直接用Ht ...
随机推荐
- redis-py中的坑
今天发现,使用redis-py从redis中获取的数据竟然是加密的. conn = redis.Redis(host='redis_serverip', port=6379, password='re ...
- spring的单元测试
如果spring 4.3.18这个版本的spring要使用junit,需要使用junit的junit-4.12之上的版本.使用这个版本junit的时 候需要引入hamcrest-all的jar包.之前 ...
- SpringCloudStream学习(三)RabbitMQ中的惰性队列
从RabbitMQ 3.6.0之后,有了 Lazy Queues 的概念-一个会尽早的将队列中的内容移动到磁盘的队列,并且只有当消费者需要的时候,才会将它们加载到内存中 惰性队列设计的一个主要 ...
- spring学习笔记(八)webSocket
知识储备 什么是stomp? 我们可以类比TCP与Http协议,我们知道Http协议是基于TCP协议的,Http协议解决了 web 浏览器发起请求以及 web 服务器响应请求的细节,我们在编码时候只要 ...
- spring学习笔记(二)spring中的事件及多线程
我们知道,在实际开发中为了解耦,或者提高用户体验,都会采用到异步的方式.这里举个简单的例子,在用户注册的sh时候,一般我们都会要求手机验证码验证,邮箱验证,而这都依赖于第三方.这种情况下,我们一般会通 ...
- Spring 循环引用(三)源码深入分析版
@ 目录 前言 正文 分析 doGetBean 为什么Prototype不可以 createBean doCreateBean getEarlyBeanReference getSingleton b ...
- Kubernetes中 Pod 是怎样被驱逐的?
前言 在 Kubernetes 中,Pod 使用的资源最重要的是 CPU.内存和磁盘 IO,这些资源可以被分为可压缩资源(CPU)和不可压缩资源(内存,磁盘 IO).可压缩资源不可能导致 Pod 被驱 ...
- 帝国cms 批量替换 字段内容包含的 指定的 关键字 SQL命令
帝国cms 批量替换 字段内容包含的 指定的 关键字update phome_ecms_news_data_1 set newstext=replace(newstext,'原来','现在');
- Linux中的vi编辑器使用
总是忘记,我就谢谢 touch XXX文件名 vi XXX文件名 敲击 i 进入编辑模式 敲击ESC 退出编辑模式 退出编辑模式后 输入:wq!保存并退出 输入:q!不保存退出 查看文件:cat XX ...
- MySQL编程
MySQL 使用标准 SQL 检索和处理数据,体积小.开源.免费,易于快速部署.正是因为这些特点,使得其在互联网行业,特别是 Web 应用方面使用相当广泛.至今最新的版本已到 8.0. 一 基本操作 ...