手把手教你学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 ...
随机推荐
- search(12)- elastic4s-聚合=桶+度量
这篇我们介绍一下ES的聚合功能(aggregation).聚合是把索引数据可视化处理成可读有用数据的主要工具.聚合由bucket桶和metrics度量两部分组成. 所谓bucket就是SQL的GROU ...
- 变分深度嵌入(Variational Deep Embedding, VaDE)
变分深度嵌入(Variational Deep Embedding, VaDE) 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 这篇博文主要是对论文“ ...
- asp.net core计划任务探索之hangfire+redis+cluster
研究了一整天的quartz.net,发现一直无法解决cluster模式下多个node独立运行的问题,改了很多配置项,仍然是每个node各自为战.本来cluster模式下的各个node应该是负载均衡的, ...
- 云小课 | WAF反爬虫“三板斧”:轻松应对网站恶意爬虫
描述:反爬虫是一个复杂的过程,针对爬虫常见的行为特征,WAF反爬虫三板斧——Robot检测(识别User-Agent).网站反爬虫(检查浏览器合法性)和CC攻击防护(限制访问频率)可以全方位帮您解决业 ...
- aop面向切面编程的实现
aop主要用于日志记录,跟踪,优化和监控 下面是来自慕课网学习的一些案例,复制黏贴就完事了,注意类和方法的位置 pom添加依赖: <dependency> <groupId>o ...
- 关于SpringBoot的外部化配置使用记录
关于SpringBoot的外部化配置使用记录 声明: 若有任何纰漏.错误请不吝指出! 记录下使用SpringBoot配置时遇到的一些麻烦,虽然这种麻烦是因为知识匮乏导致的. 记录下避免一段时间后自己又 ...
- python --分隔符split()
描述: python split()是通过指定分隔符对字符串进行切片,且可以指定分隔n+1个字符串. 语法: str.split(str="",num=string.count(s ...
- Millar Robin模板
\(Millar Robin\)模板 hdu2138 \(Code\) #include <cstdio> #include <iostream> #include <a ...
- java基础序--列化和反序列化
一.什么是序列化和反序列化: 序列化:是指把java堆内存中的对象转换成字节(二进制流)的过程.也就是通过某种方式将java对象存储在磁盘内存中,这个过程称为序列化 反序列化:是把磁盘上的对象转恢复成 ...
- fastadmin后台:在表单操作项添加操作按钮并控制弹出页面的大小
1.进入对应目录:eg(public/assets/js/backend/conmpany.js) 2.在field:'operate' 中添加buttons 源码: {field: 'operate ...