杏坛荟 > 详情

高中信息技术python的numpy模块有关函数关于axis参数的理解

2024-05-06 17:45

31人阅读 收藏

【疑难问题】

在浙教版高中信息技术必修1的“4.2.2编程处理数据”章节中,关于numpy模块中的axis参数的理解,一直是困扰初学者的疑难地方。有时候axis=0代表按行操作,例如在ny.concatenate((a1, a2, ...), axis)函数中,axis=0就表示按行拼接;有时候axis=0代表按列操作,例如在np.sort(a, axis, kind, order)函数中,axis=0就表示按列排序。到底该如何去理解axis参数?是从行和列的角度去理解吗?又或者要从别的角度来看?本文就尝试来回答这个问题。

【解决思路】

                 

利用三维坐标系来理解axis含义

一、axis是数组层级

例1. 二维数组。如下列演示代码所示:

 

二维数组a有2个轴(axis),分别是axis=0和axis=1。如下图所示,二维数组a的第0维(axis=0)有3个元素(左图),分别为a[0],a[1],a[2];第1维(axis=1)有4个元素(右图),其中第1个元素为[a[0][0],a[1][0],a[2][0]],第2个元素为[a[0][1],a[1][1],a[2][1]],以此类推。

 

例2. 三维数组。如下列演示代码所示:

我们可以把shape理解成数组在每个轴(axis)上的元素个数。三维数组b有3个轴,分别是axis=0、axis=1和axis=2。如下图所示,我们可以把三维数组b想象成一个立方体结构,其中第0维(axis=0)有3个元素(黑框),分别为b[0],b[1],b[2],各占一层,共3层。

 

第1维(axis=1)有2个元素(红框),表示每层都有2行,其中第1层第1行的元素为 b[0][0],第1层第2行的元素为 b[0][1],以此类推,第3层第2行的元素为 b[2][1]。

第2维(axis=2)有4个元素(绿框),表示每层都有4列,其中第1层第1列的元素为[b[0][0][0],b[0][1][0]],第1层第2列的元素为[b[0][0][1], b[0][1][1]],以此类推,第3层第4列的元素为[b[2][0][3],b[2][1][3]]。

 

二、若axis=i,则沿着第i维的方向进行操作

例3. 二维数组。如下列演示代码所示:

 

由上述代码可知,程序沿着axis指定的轴进行相应的函数操作。如果不知道axis,则把数组展开成一维,然后再开始计算。

 

同理,当调用函数np.sum()时,遵循相同规律。当axis=0时,生成一个新的行,其长度与原数组的每一行均相同,元素值依次为各列元素之和,即一维数组[ 6, 19, 14, 12];当axis=1时,生成一个新的列,其长度与原数组的每一列均相同,元素值依次为各行元素之和,即一维数组[13, 18, 20]。

我们可以将该规律继续推广到min()、mean()和argmin()等函数中。

   例4. 三维数组。如下列演示代码所示:

 

 

 

原理与二维数组相同,不做过多解释。可以结合代码自行理解。

三、axis参数的应用

例5. np.sort()函数,返回输入数组的排序副本。函数格式如下:

numpy.sort(a,axis, kind, order)

参数说明:

a: 要排序的数组。

axis: 沿着它排序数组的轴,如果没有,数组会被展开,沿着最后的轴排序(即二维数组默认axis=1,三维数组默认axis=2,以此类推);对于二维数组,axis=0时按列排序,axis=1时按行排序。

kind: 默认为'quicksort'(快速排序)。

order: 如果数组包含字段名称,则是要排序的字段。

如下列演示代码所示:

 

 

由如上演示代码可知,对于二维数组a,调用函数np.sort(a),相当于np.sort(a,axis=1),即默认axis=1;其功能为将二维数组a分成n列,分别对这n列的第i行排序,简称按行排序。

同理,np.sort(a, axis=0)的功能为将二维数组a分成m行,分别对这m行的第i列排序,简称按列排序。

例6. np.concatenate()函数,用于沿指定轴连接相同形状的两个或多个数组,格式如下:

numpy.concatenate((a1,a2, ...), axis)

参数说明:

a1, a2, ...:相同类型的数组

axis:沿着它连接数组的轴,默认为0,即按行拼接。

如下列演示代码所示:

 

由如上演示代码可知,对于二维数组a,调用函数np.concatenate((a,b),axis=0),其功能为将二维数组a分成m行,将二维数组b分成n行,然后依次把这些行拼接起来,组合成一个共(m+n)行的新数组。简称按行拼接。

同理,np.concatenate((a,b),axis=1),其功能为将二维数组a分成m列,将二维数组b分成n列,然后依次把这些列拼接起来,组合成一个共(m+n)列的新数组。简称按列拼接。

   例7. 为水果打分。现有四个同学分别对桔子、苹果、西瓜这三种水果打分,根据喜爱程度打1-10分。先将每位同学对三种水果的打分存储在一个一维数组中,再将4个同学的数据组合成一个二维数组a。演示代码如下:

 

如果我们想看看哪个同学最喜欢吃水果,就把他对三种水果的打分求和,代码如下:

 

可以看出第四位同学最喜欢吃水果。

如果我们想看看哪种水果最受欢迎,就把四个同学给它的打分求和,代码如下:

 

可以看出西瓜最受欢迎。