专栏首页TechFlow手把手教你学Numpy教程,从此数据处理不再慌【三】——索引篇

手把手教你学Numpy教程,从此数据处理不再慌【三】——索引篇

今天是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中对于索引的设定和功能。因此这既是重要的基本功,也是为后面的学习打基础。

本文分享自微信公众号 - TechFlow(techflow2019),作者:梁唐

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-05-28

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 手把手教你学numpy——转置、reshape与where

    首先我们来看数组重塑,所谓的重塑本质上就是改变数组的shape。在保证数组当中所有元素不变的前提下,变更数组形状的操作。比如常用的操作主要有两个,一个是转置,另...

    TechFlow-承志
  • LeetCode54 螺旋矩阵,题目不重要,重要的是这个技巧

    今天是LeetCode专题的第32篇文章,我们一起看的是LeetCode的第54题——Spiral Matrix。

    TechFlow-承志
  • Numpy专题最后一篇,随机数、线性代数与持久化

    在我们做机器学习模型的研究或者是学习的时候,在完成了训练之后,有时候会希望能够将相应的参数保存下来。否则的话,如果是在Notebook当中,当Notebook关...

    TechFlow-承志
  • cocos2dx[3.2](3) ——大

    (1)v3.0 发布说明:https://github.com/fusijie/Cocos2d-x3.0-Release-Note/blob/master/c...

    py3study
  • Apache Flink:数据流编程模型

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

    王小雷
  • 传统企业大数据应用难落地?说穿了还是因为这3点

    在中国,从2013年大数据元年始,上至国家总理,下至普通平民,大数据的词汇已经深入人心,大家都觉得大数据是个好事,但基本上都是叫好不叫坐,尤其是在传统企业中。现...

    CDA数据分析师
  • 基于Python3的木马连接工具编写

    上一次的文章中是分析了 Windows系统上 中国菜刀的工作原理,于是突发奇想,便想着用Python3也写一个和菜刀功能一样的程序出来,其实可变的地方还是挺少的...

    Elapse
  • ElasticSearch 7集群部署

    因为是测试环境,没有部署内网DNS,所以就直接走hosts文件解析了(一样所有节点服务器都执行)。

    行 者
  • [TED演讲]个人信息控制战已打响!

    大数据文摘
  • 【Data Mining】机器学习三剑客之Pandas常用用法总结(上)

    看pandas之前我建议先看我的numpy总结,效果更佳。 【Data Mining】机器学习三剑客之Numpy常用用法总结 可以大概理解为numpy主要是用来...

    接地气的陈老师

扫码关注云+社区

领取腾讯云代金券