zoukankan      html  css  js  c++  java
  • 如何理解Axis?

    前言

    只有光头才能变强。

    回顾前面:

    不知道大家最开始接触到axis的时候是怎么样的,反正我是挺难理解的..我们可以发现TensorFlow的很多API都有axis这个参数,如果我们对axis不了解,压根不知道API是怎么搞的。

    一句话总结axis:axis可以方便我们将数据进行不同维度的处理

    一、理解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. Negative axis
    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])
    
    

    参考资料:

    最后

    下一篇是TensorBoard~

    乐于输出干货的Java技术公众号:Java3y。公众号内有200多篇原创技术文章、海量视频资源、精美脑图,不妨来关注一下!

    帅的人都关注了

    觉得我的文章写得不错,不妨点一下

  • 相关阅读:
    Sqlite 语句 记录
    string.Format对C#字符串格式化
    C#耗时计算
    控件缩放
    C# winfrom Datagridview表头样式和选中样式
    C# winfrom Datagridview控件下拉菜单
    C# 平台问题
    编程思想
    强制删除sql用户链接
    MyEclipse快捷键大全
  • 原文地址:https://www.cnblogs.com/Java3y/p/10609746.html
Copyright © 2011-2022 走看看