深入理解Numpy和Tensorflow中的Axis操作

機器學習中我們需要對多維度的數據進行處理,所以搞清楚數據的維度以及numpy 和 tensorflow 對於維度的定義就非常關鍵了。這裏我們以 numpy 爲例,因爲 Tensorflow 的數據格式與 numpy 類似。

1. Axis的數量即爲數據的維度

在數學和物理中,維度通常被解釋爲空間中描述一個位置所需的最少座標個數(基底的位數)。然而在 numpy 中 axis 的個數就是數據的維度,體現在具體數據上就是括號的層數

>>> import numpy as np
>>> a = np.array([[1,2,3],[4,5,6],[7,8,9]])
>>> a
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])

舉個例子a,看似一個3x3的三維矩陣,然而,實際上只有兩層括號的嵌套,所以a只有兩個維度,也即兩個axis。只不過每個axis的長度爲3。

>>> a.shape
(3, 3)

我們要引用"5"這個元素,只需要索引axis[0] = 1,axis[1] = 1 即

>>> a[1,1]
5

2. 從內到外"扒開"張量

要寫一個高維度的數據還是比較麻煩,不過我們可以用rehape,將一個4x3的二維張量轉換成一個2x2x3 的三維張量,注意這裏: 4x3 = 2x2x3

>>> b=np.array([[1,4,8],[2,3,5],[2,5,1],[1,10,7]])    
>>> b.shape
(4, 3)
>>> b=b.reshape(2,2,3)
>>> b
array([[[ 1,  4,  8],
        [ 2,  3,  5]],

       [[ 2,  5,  1],
        [ 1, 10,  7]]])
>>> b.shape
(2, 2, 3)

我發現,要引用一個元素,比如'7',從內到外"扒開"來看,通常比較容易。最內層的括號 "7"排在第3個,即axis[2] = 2;中間層"7",所在的括號排在第2個,即 axis[1] = 1;最外層"7"所嵌套的括號排在第2個,即axis[0] = 1。所以要引用"7" 這個元素,我們需要

>>> b[1,1,2]
7

3. 對axis進行操作

在 numpy 中隊axis = n 的操作,即是對第n層(n從0開始)的操作。我們這裏以 sum 求和函數爲例。同樣的從內到外理解 sum 是如何對不同 axis (層) 進行操作的。

>>> b
array([[[ 1,  4,  8],
        [ 2,  3,  5]],

       [[ 2,  5,  1],
        [ 1, 10,  7]]])

首先如果對最內層 (axis = -1 或 2)操作,可以想象,將最內層括號內的元素進行"擠壓","擠壓"(求和)後最內層括號消失即:

[ 1, 4, 8] —> 13

[ 2, 3, 5] —> 10

[ 2, 5, 1] —> 8

[ 1, 10, 7] —> 18

同時外層結構(括號嵌套)不變

>>> b.sum(axis = 2)
array([[13, 10],
       [ 8, 18]])

中間層 (axis = 1)的操作,即可以想象,將中間層括號內的元素進行"擠壓",完成後,中間層括號消失。

[ 1, 4, 8] + [ 2, 3, 5] —> [ 3, 7, 13]

[ 2, 5, 1] + [ 1, 10, 7]—>[ 3, 15, 8]

同時內層和外層結構(括號嵌套)不變

>>> b.sum(axis = 1)
array([[ 3,  7, 13],
       [ 3, 15,  8]])

最外層(axis = 0)的操作,即可以想象,將最外層內的元素進行"擠壓",完成後,最外層括號消失。

[[ 1, 4, 8], [ 2, 3, 5]] + [[ 2, 5, 1], [ 1, 10, 7]] —>[[ 3, 7, 13],[ 3, 15, 8]]

同時內兩層結構(括號嵌套)不變

>>> b.sum(axis = 1)
array([[ 3,  7, 13],
       [ 3, 15,  8]])

4. 總結

剛開始接觸 axis 操作的時候與大多數人理解一樣,axis = 0 即代表往跨行操作,axis = 1即代表往跨列操作。這種理解方式僅對二維矩陣有效,遇到高維張量就束手無策了。希望今天介紹的這種從內到外"扒開"張量的理解方式對讀者有所啓發。


首發steemit

歡迎掃描二維碼關注我的微信公衆號“tensorflow機器學習”,一起學習,共同進步

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章