Logo

郎哥编程

数组axis(轴)的理解

2021-02-09 535

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名学员,现在需要存储每名学员的序号和两门课程的成绩。数据结构可用如下表格所示:

100.PNG

表格结构为50行3列结构,要存储类似上面表格结构的数据,用前面介绍的一维数组不能满足存储要求。因为一维数组只能存储1列数据,现在有3列数据。用什么数据结构存储上述表格的数据呢?试想一下,如果一维数组的每个元素本身也是一维数组,就可以存储上述表格数据,数据结构如下图所示:

101.png                                             

上图是二维数组结构,也称为行列结构,又称为矩阵。图中所示的下标分别是行索引和例索引。

二维数组有两个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(轴)

在上述例子中,如果学员的语文和数学成绩按学期来进行存储,其数据结构可用如下表格所示:

 102.PNG

上面的表格结构为50行3列结构,但在语文和数学列单元中又嵌套了一个3行1列的子表,二维数组无法存储上面的表格数据。如果把语文和数学列单元的数据也用一个数组表示,就可以满足上述表格数据存储要求了,其数据结构如下图所示:

103.png

类似于上面存储语文和数学学期成绩的数据结构,称之为三维数组,三维数组本质上是三层数组的嵌套,分为第一层数组(第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)方法了。

更高纬度的数组和三维数组类似,只要三维数组弄明白了,高纬度的数组也不会有问题。

代码在线纠错(通义千问 qwen-max)

支持粘贴多个代码文件,提交后由阿里云通义千问自动分析代码漏洞、语法错误、逻辑问题并给出修改建议。
您已解锁 AI 代码纠错功能,可正常使用!

评论区

登录 后发表评论
暂无评论