手把手教你学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 ...
随机推荐
- 2019国防科大校赛 B Escape LouvreⅡ
https://ac.nowcoder.com/acm/contest/878/B 这个题目是一个网络流,但是建图却没有那么好建,首先我们都会把每一个人与源点相连,每一个洞口和汇点相连. 然后人和洞口 ...
- Vue列表实现滚动到指定位置样式改变
这个需求大概是这样子: 我做的一个聊天Demo,在搜索框搜索用户,可以滚动到指定的用户.然后成选中状态. 这是目前状态,我搜索 南宫仆射 ,想要下面的用户列表直接滚动到 南宫仆射 并改变CSS样式. ...
- hadoop中如何动态更新集群队列和容量
1.集群默认是FIFO容量调度器,有的时候不同的业务部门都需要使用hadoop集群,那么这时候就需要来设置容量调度器了,如何平衡各个部门的容量.合理利用资源? 首先配置调度器需要在修改两个配置文件,分 ...
- Excel开始,Excel结束,R语言居中
入职.离职,总公司调往分公司,分公司调往总公司,每月社保.公积金和上月比较有增减.税局导出的为Excel文件,需要和记录对照一番. 用Excel处理,那就是姓名粘贴为两列,条件格式-重复值,没变色的为 ...
- [hdu5358]分类统计,利用单调性优化
题意:直接来链接吧http://acm.hdu.edu.cn/showproblem.php?pid=5358 思路:注意S(i,j)具有区间连续性且单调,而⌊log2x⌋具有区间不变性,于是考虑枚举 ...
- javaweb学习之路(2)response
写一个简单的登录页面 1.创建一个login.jsp文件 主要内容: <form action="check.jsp" method="post"> ...
- HTTP Status完整枚举
HTTP Status完整枚举 public enum HttpStatus { // 1xx Informational 1xx信息类的 继续 CONTINUE(100, "C ...
- JPA 分页处理
1.要实现jpa分页管理首先得要正确配置jpa环境,在spring环境中的配置如下: 开启注解功能 <bean class="org.springframework.orm.jpa.s ...
- vue打包 报错问题记录
1. assetsPublicPath: '/' 修改为 assetsPublicPath: './' 2. untils.js里面增加 publicPath: '../../' 重新运行 ...
- javascript 之 eventLoop
首先,javascript 是一门单线程,无阻塞的脚本语言. 何为单线程:就是在任何时候都只有一条线程在执行代码. 无阻塞:就是执行代码任务时一路绿灯,畅通无阻. 无阻塞的实现主要依赖于一个机制,就是 ...