欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

对tensorflow,numpy中axis参数的理解

程序员文章站 2022-04-03 07:57:46
...

1. 引言

在利用tensorflow或者numpy对向量/数组(下文统称向量)进行操作时,开发者可以通过设置axis参数来对向量中特定的维度进行操作。因此,理解axis究竟指向哪一个维度就变成了一个重要的问题。本文将结合相应例子,简明扼要地对axis的指向进行介绍。本文重点在于解释axis指向性,下文将统一使用numpy.sum()作为例子进行讲解。

2. 什么是维度?

在日常应用中,维度一般存在两种解释。第一种解释即大家熟悉的坐标数目,例如,[1,3,4]是一维的,这是一条直线。[[1,2],[3,4]]是一个方阵,是二维的。第二种解释认为维度即特征数目。例如,形容用身高,体重,收入三个特征可以具体描述一个人,用这三个特征形成的向量:[身高,体重,收入]是一个三维向量。这两种解释读者应该加以区别。axis对应第一种解释,即针对坐标数目来指定维度的。

3. axis的指向

3.1 对维度的一些理解

高维向量其实就是一个把低维向量作为元素的向量。例如:[[1,2],[2,3]]是一个二维向量,这其实是把一维向量([1,2],[2,3])作为元素的向量。三维数组[ [[1,2], [3,4]], [[5,6], [7,8]] ]就是把二维向量([[1,2], [3,4]]和[[5,6], [7,8]])作为元素的向量。这样一点理解至关重要。3.2小节将用三位向量为例,说明axis的指向,3.3小节将尝试对四维数组进行axis的指向说明。

3.2 以三维数组为例

三维向量,可以用三维笛卡尔坐标系进行描述。现在有一个形状为2* 3 * 4的三维的向量:

[[[ 1   2   3   4]
  [ 5   6   7   8]
  [ 9   10 11 12]],
 [[ 13  14 15 16]
  [ 17  18 19 20]
  [ 21  22 23 24]]]

该向量在笛卡尔坐标系中的示意图即为:
对tensorflow,numpy中axis参数的理解
axis 与 笛卡尔坐标系的对应关系为:

axis 笛卡尔
0 z轴
1 x轴
2 y轴

对axis=0进行求和,实际上是对z轴方向进行求和,直观上看正是两个二维矩阵进行叠加求和后的维度为:3 * 4。示意图如下:
对tensorflow,numpy中axis参数的理解

[[1+13   2+14   3+15 4+16]
 [5+17   6+18   7+19 8+20]
 [9+21 10+22 11+23 12+24]]

对axis=1进行求和,正是对x轴方向进行求和,直观上来看正是每个矩形中的每一列进行求和。 求和后的维度为:2 * 4。示意图如下:
对tensorflow,numpy中axis参数的理解

[[ 1 + 5 + 9   2 + 6+10   3 + 7+11   4 + 8+12]
 [13+17+21     14+18+22   15+19+23   16+20+24]]

对axis=2进行求和,正是对y轴方向进行求和,直观上看正是每个矩形中的每一行进行求和。 求和后的维度为:2* 3。示意图如下:
对tensorflow,numpy中axis参数的理解

[[1+2+3+4          5+6+7+8          9+10+11+12]
 [13+14+15+16      17+18+19+20      1+22+23+24]]

看到这里大家应该对axis的指向有一些感性的认识了。

3.3 延申:四维数组

正如前面所说,高维向量的元素实际上由维度低一维的向量组成(三维向量的元素是二维元素),那四维向量的元素就应该是三维向量(有多个立方体组成),以一个维度为
2 * 2* 3 * 4的向量为例,该示意图如所示:
对tensorflow,numpy中axis参数的理解
每一维度的具体物理意义为:
对tensorflow,numpy中axis参数的理解
axis的指向:

axis 笛卡尔
0 两个立方体融合
1 分别对两个立方体的z轴进行融合
2 分别对两个立方体的x轴进行融合
3 分别对两个立方体的y轴进行融合

对于5维向量,6维向量,我们也可以依次递推。

4 axis的降维作用

留意3.2小节,在对数组的某一维进行操作后,维度均会减少,这正是axis参数的核心作用之一:降维。那该如何确定对某一维进行操作后的输出维度是多少呢?以axis=0为例,对于2* 3 * 4向量:

对axis=0进行求和,即z轴上的两个矩阵融合成一个矩阵,所以输出维度为 3 * 4
对axis=1进行求和,即分别对两个矩阵的列进行求和,所以输出维度为 2 * 4
对axis=2进行求和,即分别对两个矩阵的行进行求和,所以输出维度为 2 * 3
具体为:
对tensorflow,numpy中axis参数的理解
所以,输出的维度就是抹消axis指向的那一维,保留其余的维度(该维度的信息被融合了)。

参考

numpy手册
https://www.jianshu.com/p/30b40b504bae

相关标签: API