如何理解Axis?

Java3y發表於2019-03-27

如何理解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多篇原創技術文章、海量視訊資源、精美腦圖,不妨來關注一下!

帥的人都關注了

覺得我的文章寫得不錯,不妨點一下

相關文章