NumPy索引和切片

《NumPy索引和切片》

简介

索引和切片是NumPy中最重要最常用的操作。熟练使用NumPy切片操作是数据处理和机器学习的前提,所以一定要掌握好。

一维数组切片操作

从表面上看,一维数组的切片操作和python列表相似,索引都是从0开始。

代码演示:

还可以将标量赋值给一个切片,此时会将该值自动赋值到整个选区,比如:

这个功能叫做“广播”。

另外,数组跟列表的的区别还在于,列表切片后是对源数据的复制,改变切片值不会影响到原来的列表;而数组不一样,数组切片后依然是源数据,改变切片值会影响到原来的数组。

代码演示:

可以这样认为,NumPy处理的数组都很大,如果每次操作都将数据复制的话,会大大降低效率。但是如果想复制数组的话,就必须要显示复制操作。如下:

这样就不会改变原来的数组了。

多维数组

NumPy强大的地方就是能够进行多维数组的快速运算。判断一个多维数组的大小是根据每条轴上的数量决定的:

我们可以根据[]的数量计算维度的大小。

代码演示:

在这里,我们创建了一个大小为(2, 3)的数组,也就是说在第0轴上有两行数[1, 2, 3]和[4, 5, 6],而在第1轴上有3列数[1, 4]、[2, 5]和[3, 6]。或者这样来看,从前面开始数有几个[括号,表示几维。第一个[包含的数据数量为第0维的大小,第二个[包含的数据数量为第1维的大小。在这里第一个[包含两个数据[1, 2, 3]、[4, 5, 6],第二个[包含3个数据。所以大小为(2, 3)。以此类推,我们就可以得到高维数据的大小了:

这里通过随机数函数randn()生成了一个三维的数组。

访问多维数组中的元素

有两种方式访问多维数组中的元素。

代码演示:

第一种方式通过递归访问,首先a[2]将得到array([8, 9, 10, 11]),然后a[2][0]访问索引为0的数字,得到8;如果对数组的大小理解清楚了,那么第二种方式就是非常直接的指定了该数据在第0轴的索引2位置和第1轴的索引0位置。

为了加深印象,我们再举一个例子:

此时构建了一个三维的数组,我们只要返回第0轴上索引为1,第1轴上索引为0的数据,也就得到了一个数组array([6, 7, 8])

切片索引

明白高维数组每个轴的索引关系,那么高维数组的切片索引就很好理解了。比如:

同样可以通过赋值操作“广播”数据。

布尔型索引

通过布尔型数组可以进行数组索引:

布尔型数组的长度必须跟被索引的轴长度一致。布尔型数组还能和切片合用:

花式索引

花式索引是指通过整数数组进行索引。

代码演示:

需要注意的是,花式索引跟切片不同,总是将数据复制到新的数组。通过在索引轴上传入整数数组,可以精确地提取出某个数据。

总结

本文详细地介绍了NumPy中的数组索引和切片方法,要根据所需灵活使用;搞清楚多维数组每个轴的索引方式,配合花式索引会有意想不到的效果。

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注

5 × 3 =