概述
一、问题:
在上一篇博客【数据分析与智能计算】2.1 课后练习及参考答案中,在评论区有同学提了个很好的问题:
参考答案的第18行和第20行中,我们为什么可以用
names
和subjects
来对scores
数组进行“条件筛选”。就好似names
和subjects
是scores
的表头一样?
18行和20行主要涉及了一下这两个切片的操作:
scores[[2,4]][:,(subjects == 'Python')]
scores[:,(subjects == 'English') | (subjects == 'Art')]
我们知道,数组本身是只是个按一定顺序排列的数表,是不存在行/列索引(“表头”)的概念的。
那么我们的就问题是:为什么我们可以用一个数组来对另一个独立的数组进行切片(“条件筛选”)的操作呢?
二、分析:
从上图我们可以看到,names
subjects
和scores
是三个独立的数组,只不过他们之间有着那么一点联系:
names
是个一维数组,有5个元素(分别对应5个人的名字)subjects
是个一维数组,有7个元素(分别对应7个科目名)scores
是个二维数组,有5行7列,其中每一行对应每个人的成绩,且与names
中人名的顺序一致;每一列对应每个科目的成绩,且与subjects
中的科目名的顺序一致。
所以说,虽然他们三个是独立的数组,但是因为它们之间有上述的关联,所以我们也是能够通过用names
和subjects
来对scores
进行“条件筛选”的。
三、具体原理:
- numpy数组除了用位置序号进行切片以外,还可以用一个长度与之对应的布尔型列表来进行切片(对应位置为
True
的留下),如:scores[ [1,3], :]
和scores[ [False,True,False,True,False] , :]
的结果是一样的。
- 当一个
数组
和一个值
做逻辑运算的时候,会返回一个形状与原数组一样的布尔型数组(数组中对应值的位置为True
)如: - 同时我们可以将两个上述的布尔数组再做逻辑运算(如
|
表示的逻辑与): - 我们可以看到第3步生成的布尔型数组就和第1步用来切片的布尔型列表是一样的了。
- 结合以上4步,我们可以巧妙地把看起来不相关的
names
数组用于scores
数组的切片了
即scores[ [1,3], :]
与scores[ (names == '肖良英') | (names == '刘旭阳'), :]
是等价的。
同理,我们可以用subjects
来对scores
的行进行筛选。
四、总结:
- 用于切片的布尔型数组的元素个数一定要与被切片的行/列数相等。(否则会报错)
- 用于切片的数组和被切片的数组本身是独立的,数组的“条件筛选”的本质其实是以布尔型数组为载体的按位置切片。
如果你正在学习/复习“数据分析与智能计算”这门课,或者是想要入门大数据、人工智能的同学,欢迎订阅本专栏~
觉得有用的话,不要忘了点赞、关注、分享哦~大家多多包涵,有任何问题欢迎指正、讨论。
本文基于CC-BY-NC-SA 4.0协议,请规范转载。
(博客看累了?去我的B站瞧一瞧?)
最后
以上就是淡淡大米为你收集整理的【NumPy】数组的条件筛选的全部内容,希望文章能够帮你解决【NumPy】数组的条件筛选所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复