NumPy主要的数据结构就是数组,NumPy函数对数组进行运算或操作时,会对数组进行索引,索引的过程就会使用到axis(轴),如果对axis(轴)不太理解,对数组的索引就会出现问题,下面来探讨axis(轴)的概念。
axis(轴)是数组结构的维度,一维数组只有1个axis(轴),二维数组有2个axis(轴),三维数组有3个axis(轴),以此类推,n维数组有n个轴。
1、 一维数组的axis(轴)
一维数组的axis(轴)很容易理解,一维数组只有1行数据,该行即为数组的axis(轴)。
例如:
>>> import numpy as np >>> a = np.array([10,11,12,16,30,31,101,102,103])
一维数组a只有1个轴,调用cumsum(axis)方法时,只能传入0,若传入0以上的数值,该方法会报错。
>>> a.cumsum(1) Traceback (most recent call last): File "<pyshell#3>", line 1, in <module> a.cumsum(1) numpy.AxisError: axis 1 is out of bounds for array of dimension 1 >>>
错误原因是传入的参数axis超出了数组的维度。
调用cumsum(axis)方法,传入参数0,会返回a数组0轴元素的累加和。
>>> a.cumsum(0) array([ 10, 21, 33, 49, 79, 110, 211, 313, 416], dtype=int32)
观察cumsum(axis)方法输出结果,它会返回一个新的数组,该数组的长度和原数组的长度相同。该数组的第1个元素数值与原数组的元素数值相同,第2个元素数值是原数组第1个和第2个元素数值的累加和,第3个元素数值是该数组第2个元素与原数组第3个元素的累加和,第4个元素数值是该数组第3个元素与原数组第4个元素的累加和,以此类推,该数组第n个元素是该数组第n-1个元素与原数组第n个元素的累加和。
2、 二维数组的axis(轴)
在用程序解决实际问题中,经常会遇到类似下面问题。例如,有50名学员,现在需要存储每名学员的序号和两门课程的成绩。数据结构可用如下表格所示:
表格结构为50行3列结构,要存储类似上面表格结构的数据,用前面介绍的一维数组不能满足存储要求。因为一维数组只能存储1列数据,现在有3列数据。用什么数据结构存储上述表格的数据呢?试想一下,如果一维数组的每个元素本身也是一维数组,就可以存储上述表格数据,数据结构如下图所示:
上图是二维数组结构,也称为行列结构,又称为矩阵。图中所示的下标分别是行索引和例索引。
二维数组有两个axis(轴),第1维为纵轴(0轴),第2维为横轴(1轴)。
例如:
>>> a = np.array([[10,11,12,18,20], [22,32,62,82,102], [36,39,29,27,21], [79,75,71,70,73], [91,92,93,94,95] ])
二维数组a有2个轴,调用cumsum(axis)方法时,可以传入0和1,0对应二维数组的纵轴(第1维),1对应二维数组的横轴(第2维)。
调用cumsum(axis)方法,传入参数0,会返回a数组纵轴元素的累加和。
>>> a.cumsum(0) array([[ 10, 11, 12, 18, 20], [ 32, 43, 74, 100, 122], [ 68, 82, 103, 127, 143], [147, 157, 174, 197, 216], [238, 249, 267, 291, 311]], dtype=int32) >>>
调用cumsum(axis)方法,传入参数1,会返回a数组横轴元素的累加和。
>>> a.cumsum(1) array([[ 10, 21, 33, 51, 71], [ 22, 54, 116, 198, 300], [ 36, 75, 104, 131, 152], [ 79, 154, 225, 295, 368], [ 91, 183, 276, 370, 465]], dtype=int32)
3、 三维数组的axis(轴)
在上述例子中,如果学员的语文和数学成绩按学期来进行存储,其数据结构可用如下表格所示:
上面的表格结构为50行3列结构,但在语文和数学列单元中又嵌套了一个3行1列的子表,二维数组无法存储上面的表格数据。如果把语文和数学列单元的数据也用一个数组表示,就可以满足上述表格数据存储要求了,其数据结构如下图所示:

类似于上面存储语文和数学学期成绩的数据结构,称之为三维数组,三维数组本质上是三层数组的嵌套,分为第一层数组(第1维)、第二层数组(第2维)、第三层数组(第3维)。第一层数组的元素是第二层数组,第二层数组的元素是第三层数组。访问三维数组的元素时,需要同时给出三个数组的索引。
例如:
>>> import numpy as np >>> a = np.array([[[5., 2.], [3., 4.]], [[1., 6.], [7., 8.]]])
三维数组a有3个轴,调用cumsum(axis)方法时,可以传入0、1、2,0对应三维数组的第1维,1对应三维数组的第2维,2对应三维数组的第3维。
调用cumsum(axis)方法,传入参数0,会返回a数组第1维元素的累加和。
>>> a.cumsum(0) array([[[ 5., 2.], [ 3., 4.]], [[ 6., 8.], [10., 12.]]])
调用cumsum(axis)方法,传入参数1,会返回a数组第2维元素的累加和。
>>> a.cumsum(1) array([[[ 5., 2.], [ 8., 6.]], [[ 1., 6.], [ 8., 14.]]])
调用cumsum(axis)方法,传入参数2,会返回a数组第3维元素的累加和。
>>> a.cumsum(2) array([[[ 5., 7.], [ 3., 7.]], [[ 1., 7.], [ 7., 15.]]])
自己在Shell窗口运行一下代码,仔细体会输出结果,就会逐渐理解数组的axis(轴)及Numpy的cumsum(axis)方法了。
更高纬度的数组和三维数组类似,只要三维数组弄明白了,高纬度的数组也不会有问题。