【NumPy】数组的条件筛选

一、问题:

在上一篇博客【数据分析与智能计算】2.1 课后练习及参考答案中,在评论区有同学提了个很好的问题:

参考答案的第18行和第20行中,我们为什么可以用namessubjects来对scores数组进行“条件筛选”。就好似namessubjectsscores的表头一样?

18行和20行主要涉及了一下这两个切片的操作:

scores[[2,4]][:,(subjects == 'Python')]
scores[:,(subjects == 'English') | (subjects == 'Art')]

我们知道,数组本身是只是个按一定顺序排列的数表,是不存在行/列索引(“表头”)的概念的。

那么我们的就问题是:为什么我们可以用一个数组来对另一个独立的数组进行切片(“条件筛选”)的操作呢?


二、分析:

在这里插入图片描述

从上图我们可以看到,names subjectsscores是三个独立的数组,只不过他们之间有着那么一点联系:

  1. names是个一维数组,有5个元素(分别对应5个人的名字)
  2. subjects是个一维数组,有7个元素(分别对应7个科目名)
  3. scores是个二维数组,有57列,其中每一行对应每个人的成绩,且与names中人名的顺序一致;每一列对应每个科目的成绩,且与subjects中的科目名的顺序一致。

所以说,虽然他们三个是独立的数组,但是因为它们之间有上述的关联,所以我们也是能够通过用namessubjects来对scores进行“条件筛选”的。


三、具体原理:

  1. numpy数组除了用位置序号进行切片以外,还可以用一个长度与之对应的布尔型列表来进行切片(对应位置为True的留下),如:scores[ [1,3], :]scores[ [False,True,False,True,False] , :]的结果是一样的。
    在这里插入图片描述
  2. 当一个数组和一个逻辑运算的时候,会返回一个形状与原数组一样的布尔型数组(数组中对应值的位置为True)如:在这里插入图片描述
  3. 同时我们可以将两个上述的布尔数组再做逻辑运算(如|表示的逻辑与):在这里插入图片描述
  4. 我们可以看到第3步生成的布尔型数组就和第1步用来切片的布尔型列表是一样的了。
  5. 结合以上4步,我们可以巧妙地把看起来不相关的names数组用于scores数组的切片了
    scores[ [1,3], :]
    scores[ (names == '肖良英') | (names == '刘旭阳'), :]是等价的。
    在这里插入图片描述

同理,我们可以用subjects来对scores的行进行筛选。


四、总结:

  1. 用于切片的布尔型数组的元素个数一定要与被切片的行/列数相等。(否则会报错)
  2. 用于切片的数组和被切片的数组本身是独立的,数组的“条件筛选”的本质其实是以布尔型数组为载体的按位置切片。

如果你正在学习/复习“数据分析与智能计算”这门课,或者是想要入门大数据、人工智能的同学,欢迎订阅本专栏~
觉得有用的话,不要忘了点赞、关注、分享哦~大家多多包涵,有任何问题欢迎指正、讨论。
本文基于CC-BY-NC-SA 4.0协议,请规范转载。
(博客看累了?去我的B站瞧一瞧?)

猜你喜欢

转载自blog.csdn.net/qq_27133869/article/details/106386747