对tensorflow,numpy中axis参数的理解
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]]]
该向量在笛卡尔坐标系中的示意图即为:
axis 与 笛卡尔坐标系的对应关系为:
axis | 笛卡尔 |
---|---|
0 | z轴 |
1 | x轴 |
2 | y轴 |
对axis=0进行求和,实际上是对z轴方向进行求和,直观上看正是两个二维矩阵进行叠加求和后的维度为:3 * 4。示意图如下:
[[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。示意图如下:
[[ 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。示意图如下:
[[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的向量为例,该示意图如所示:
每一维度的具体物理意义为:
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
具体为:
所以,输出的维度就是抹消axis指向的那一维,保留其余的维度(该维度的信息被融合了)。
参考
numpy手册
https://www.jianshu.com/p/30b40b504bae
上一篇: 搞笑漫画图片Mocmoc系列 第二季
下一篇: 通过数组实现ArrayList的各种方法