对于索引与切片的概念相信大家应一定不会感到陌生,这属于 Python 的基础知识,在 Numpy 数组中同样也存在索引与切边的操作,它能够实现根据索引获取相应位置元素以及截取相应长度数组的目的,其实 Numpy 一维数组的索引切片操作和 Python 列表的操作相差无几,只存在一点点的区别,但是在本节我们主要研究对象是多维数组。
我们知道 Numpy 数组的索引下标从 0 开始的,而且同样也可以使用负索引,这与 Python 列表中索引没有区别。下面我们来看一组例子,如何通过索引操作多维数组:
- In [1]: import numpy as np
- In [2]: array=np.arange(1,9)
- #使用reshape变维生成3维数组
- In [3]: array=array.reshape(2,2,2)
- Out[3]:
- array([[[1, 2],
- [3, 4]],
-
- [[5, 6],
- [7, 8]]])
- In [4]: print(array[0])
- [[1 2]
- [3 4]]
- In [5]: print(array[0][0])
- [1 2]
- In [6]: print(array[0][0][0])
- 1
- In [7]: print(array[0][0][1])
- 2
- In [8]: print(array[0][1][0])
- 3
上面构成的三维数组可以看做是由两个(2,2)的二维数组构成的,多维数组通过索引取值,如上所示,一个位置 [0] 会获得第一个二维数组,第二个位置的 [0] 会得到一个维数组,只有最后一个的 [0] 才会得到最终的数字。就好比可以使用三层嵌套 for 循环对三维数组进行取值,如下所示:
- In [5]: for i in range(array.shape[0]):
- ...: for j in range(array.shape[1]):
- ...: for k in range(array.shape[2]):
- ...: print(array[i, j, k])
- 1 2 3 4 5 6 7 8
提示:三维数组可以看做是(个数,行,列)的形式,array[0][1][0] 代表组成三维数组的第一个二维数组的第二行第一列的值,也就是 3。
针对多维数组的索引我们还可以使用如下形式进行取值:
- In [2]: import numpy as np
- In [3]: data=np.random.randn(2,3)
- In [4]: data
- Out[4]:
- array([[ 2.28610225, -0.0166523 , 1.1315245 ],
- [ 0.47336805, -0.59291117, 0.43233981]])
- In [5]: data[0,2]
- Out[5]: 1.131524504289503
上述使用方式等同于使用 [0][2] 的操作方法,这种方法叫做多数组索引。对于二维数组来说,我可以按照下图将 axis0 轴看做是“行”,而将 axis1 轴当做是列,如下所示:
Numpy 数组的索引操作做,我们要重点理解它与 Python 列表的不同之处,还要掌握多数组索引的方法。在下一节我们将讲解 Numpy 数组的切片操作!