Python高级索引是一个很trick的操作,用的好可以提高效率,但是如果不了解也经常容易看不懂别人代码写的什么意思........
高级索引大致可分为整数数组索引、布尔索引及花式索引三类
花式索引(整数数组索引 / index索引 / tuple索引)
花式索引(Fancy indexing)是指利用整数数组进行索引,这里的整数数组可以是numpy数组也可以是Python中列表、元组等可迭代类型。
整数数组索引指使用同形状的多个数组分别指定元素的所有维度(不指定的维度也可以用切片
:
或省略号...
与索引数组组合),可精准取出一批指定位置的元素,按照给定数组形状返回。例1:
取出x中(0,0),(1,1)和(2,0)位置处的元素。
传入的位置指定数组也可为多维
例2
取出x[[(0,0),(0,2)],[3,0, 3,2]]的元素,这样的话会组成一个shape是[2,2]的数组
传入的索引是什么形式,是几维的,输出值就是什么形式
索引的“广播”
结果的size是和索引的size相match的,而不是供索引的值的size
布尔索引
我们可以通过一个布尔数组来索引目标数组
像这里就是idx1的shape为[3]的,就是对应着x的第一维,这样就是x[0]拿掉,x[1],x[2]保留,所以x[idx1]的shape就变成(2,2,4)了
idx1的shape也必须为3,不然会报错
如果idx是两维的,它就必须和x的前两维对上,即必须是(3,2)的
x[idx2]的第一个4是idx2中True的个数,第二个4是第三维的个数,因为idx2只有前两维,所以第三维没动
如果idx是三维的,它就必须和x的shape全对上,即必须是(3,2,4)的
x[idx3]的shape只有1维了,即idx3中True的个数是14个
布尔索引也通过布尔运算(如:比较运算符)来获取符合指定条件的元素的数组
取出大于5的元素
过滤掉为nan的值
过滤掉复数元素
通过布尔值取某几行