一、理解axis
如果你像我一样,发现API中有axis这个参数,但不知道是什么意思。可能就会搜搜axis到底代表的什么意思。于是可能会类似搜到下面的信息:
使用0值表示沿着每一列或行标签\索引值向下执行方法(axis=0代表往跨行)
使用1值表示沿着每一行或者列标签模向执行对应的方法(axis=1代表跨列)
但我们又知道,我们的数组不单单只有二维的,还有三维、四维等等。一旦维数超过二维,就无法用简单的行和列来表示了。
所以,可以用我下面的方式进行理解:
axis=0
将最开外头的括号去除,看成一个整体,在这个整体上进行运算axis=1
将第二个括号去除,看成一个整体,在这个整体上进行运算- …依次类推
话不多说,下面以例子说明~
1.1二维数组之concat
首先,我们来看个concat
的例子,concat第一个参数接收val,第二个参数接收的是axis
def learn_concat(): # 二维数组 t1 = tf.constant([[1, 2, 3], [4, 5, 6]]) t2 = tf.constant([[7, 8, 9], [10, 11, 12]]) with tf.Session() as sess: # 二维数组针对 axis 为0 和 1 的情况 print(sess.run(tf.concat([t1, t2], 0))) print(sess.run(tf.concat([t1, t2], 1)))
ok,下面以图示的方式来说明。现在我们有两个数组,分别是t1和t2:
两个数组,t1和t2
首先,我们先看axis=0
的情况,也就是tf.concat([t1, t2], 0)
。从上面的描述,我们知道,先把第一个括号去除,然后将其子内容看成一个整体,在这个整体下进行想对应的运算(这里我们就是concat)。
二维数组 axis=0的concat操作
所以最终的结果是:
[ [1 2 3], [4 5 6], [7 8 9], [10 11 12] ]
接着,我们再看axis=1
的情况,也就是tf.concat([t1, t2], 1)
。从上面的描述,我们知道,先把第二个括号去除,然后将其子内容看成一个整体,在这个整体下进行想对应的运算(这里我们就是concat)。
axis=1理解 二维数组 concat
所以最终的结果是:
[ [1, 2, 3, 7, 8, 9] [4, 5, 6, 10, 11, 12] ]
1.2三维数组之concat
接下来我们看一下三维的情况
def learn_concat(): # 三维数组 t3 = tf.constant([[[1, 2], [2, 3]], [[4, 4], [5, 3]]]) t4 = tf.constant([[[7, 4], [8, 4]], [[2, 10], [15, 11]]]) with tf.Session() as sess: # 三维数组针对 axis 为0 和 1 和 -1 的情况 print(sess.run(tf.concat([t3, t4], 0))) print(sess.run(tf.concat([t3, t4], 1))) print(sess.run(tf.concat([t3, t4], -1)))
ok,下面也以图示的方式来说明。现在我们有两个数组,分别是t3和t4:
两个数组,t3和t4
首先,我们先看axis=0
的情况,也就是tf.concat([t3, t4], 0)
。从上面的描述,我们知道,先把第一个括号去除,然后将其子内容看成一个整体,在这个整体下进行想对应的运算(这里我们就是concat)。
axis=0理解 三维数组 concat
所以最终的结果是:
[ [ [1 2] [2 3] ] [ [4 4] [5 3] ] [ [7 4] [8 4] ] [ [2 10] [15 11] ] ]
接着,我们再看axis=1
的情况,也就是tf.concat([t3, t4], 1)
。从上面的描述,我们知道,先把第二个括号去除,然后将其子内容看成一个整体,在这个整体下进行想对应的运算(这里我们就是concat)。
axis=1理解 三维数组 concat
所以最终的结果是:
[ [ [1 2] [2 3] [7 4] [8 4] ] [ [4 4] [5 3] [2 10] [15 11] ] ]
最后,我们来看一下axis=-1
这种情况,在文档也有相关的介绍:
As in Python, the
axis
could also be negative numbers. Negativeaxis
are interpreted as counting from the end of the rank, i.e.,
axis + rank(values)
-th dimension
所以,对于我们三维的数组而言,那axis=-1
实际上就是axis=2
,下面我们再来看一下这种情况:
axis=-1理解 三维数组 concat
最终的结果是:
[ [ [1 2 7 4] [2 3 8 4] ] [ [4 4 2 10] [5 3 15 11] ] ]
除了concat以外,其实很多函数都用到了axis这个参数,再举个例子:
>>> item = np.array([[1,4,8],[2,3,5],[2,5,1],[1,10,7]]) >>> item array([[1, 4, 8], [2, 3, 5], [2, 5, 1], [1, 10, 7]]) >>> item.sum(axis = 1) array([13, 10, 8, 18]) >>> item.sum(axis = 0) array([ 6, 22, 21])