本文始发于个人公众号: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,从此数据处理不再慌【三】的更多相关文章

  1. 手把手教你学Numpy,从此处理数据不再慌「一」

    当当当,我又开新坑了,这次的专题是Python机器学习中一个非常重要的工具包,也就是大名鼎鼎的numpy. 所以今天的文章是Numpy专题的第一篇. 俗话说得好,机器学习要想玩的溜,你可以不会写Pyt ...

  2. 手把手带你入门numpy,从此数据处理不再慌【四】

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是numpy专题的第四篇文章,numpy中的数组重塑与三元表达式. 首先我们来看数组重塑,所谓的重塑本质上就是改变数组的shape.在保 ...

  3. 手把手教你学Numpy,搞定数据处理——收官篇

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是Numpy专题第6篇文章,我们一起来看看Numpy库当中剩余的部分. 数组的持久化 在我们做机器学习模型的研究或者是学习的时候,在完成 ...

  4. 手把手教你学Numpy,这些api不容错过

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是Numpy专题的第5篇文章,我们来继续学习Numpy当中一些常用的数学和统计函数. 基本统计方法 在日常的工作当中,我们经常需要通过一 ...

  5. 30分钟手把手教你学webpack实战

    30分钟手把手教你学webpack实战 阅读目录 一:什么是webpack? 他有什么优点? 二:如何安装和配置 三:理解webpack加载器 四:理解less-loader加载器的使用 五:理解ba ...

  6. 每天记录一点:NetCore获得配置文件 appsettings.json vue-router页面传值及接收值 详解webpack + vue + node 打造单页面(入门篇) 30分钟手把手教你学webpack实战 vue.js+webpack模块管理及组件开发

    每天记录一点:NetCore获得配置文件 appsettings.json   用NetCore做项目如果用EF  ORM在网上有很多的配置连接字符串,读取以及使用方法 由于很多朋友用的其他ORM如S ...

  7. NN入门,手把手教你用Numpy手撕NN(三)

    NN入门,手把手教你用Numpy手撕NN(3) 这是一篇包含极少数学的CNN入门文章 上篇文章中简单介绍了NN的反向传播,并利用反向传播实现了一个简单的NN,在这篇文章中将介绍一下CNN. CNN C ...

  8. 手把手教你学Dapr - 3. 使用Dapr运行第一个.Net程序

    上一篇:手把手教你学Dapr - 2. 必须知道的概念 注意: 文章中提到的命令行工具即是Windows Terminal/PowerShell/cmd其中的一个,推荐使用Windows Termin ...

  9. 手把手教你学Dapr - 4. 服务调用

    上一篇:手把手教你学Dapr - 3. 使用Dapr运行第一个.Net程序 介绍 通过使用服务调用,您的应用程序可以使用标准的gRPC或HTTP协议与其他应用程序可靠.安全地通信. 为什么不直接用Ht ...

随机推荐

  1. centos8-django项目部署 nginx+uwsgi

    1.虚拟环境virtualenv安装 1.安装virtualenv pip3 install virtualenv 2.创建目录,把项目文件传过来 mkdir My cd My 3.创建独立运行环境- ...

  2. P2380狗哥采矿(状态不易设计)

    描述:https://www.luogu.com.cn/problem/P2380 首先分析一下,易知传送带一定是要么向上,要么向右.且一定摆满了整个矩阵. 所以我们设 f [ i ] [ j ]表示 ...

  3. 2019-2020Nowcoder Girl初赛 题解

    题目都不是很难,就是最后一题有点毒瘤 第一题:牛妹爱整除 这个你把一个进制数进行拆分,拆分成若干位,然后在取模,这样会发现如果是x进制的数,那么对x+1这个进制转化即满足条件. 举个例子:一个x进制数 ...

  4. u-boot 移植(一)编译环境搭建

    u-boot 移植(一)编译环境搭建 soc:s3c2440 board:jz2440 uboot:u-boot-2016.11 toolchain:gcc-linaro-7.4.1-2019.02- ...

  5. haskell ide - vscode

    以windows为例(因为手头只有这个系统,linux系统下类似) 1. 下载安装vscode 2. 安装haskell的管理工具stack,将路径添加到环境变量path 3. windows下安装s ...

  6. UEFI Shell --常用命令解释

    UEFI Shell解释 UEFI Shell 是一个提供用户和UEFI系统之间的接口,进入UEFI Shell可以对计算机系统进行配置 命令解释: 单独的help就可以输出所有指令,不做特殊说明,内 ...

  7. 基于Memcached的Nginx服务器集群session共享

    原料:jdk1.8,tomcat7,nginx1.16,memcached-1.2.6,Mem-Tomcat需要的jar包,基于windows7.所有的点击以下链接可下载 链接:https://pan ...

  8. 如何搭建一个WEB服务器项目(一)—— 开篇 ,搭建SSH整合框架

    使用Intellij IDEA2019创建SSH(Spring+SpringMVC+Hibernate+Maven整合)项目 观前提示:本系列文章有关服务器以及后端程序这些概念,我写的全是自己的理解, ...

  9. 手机APP自动化环境搭建

    1 摘要 近年来,随着移动应用从数量上和逻辑复杂程度上的增长,以及产品发布周期的紧缩,使得回归测试迫在眉睫,鉴于此APP自动化测试变得越来流行,当前主流的APP自动化工具有:Appium.Roboti ...

  10. 「雕爷学编程」Arduino动手做(31)——ISD1820语音模块

    37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器和模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里 ...