TShopping

 找回密碼
 註冊
搜索
查看: 288|回復: 0
打印 上一主題 下一主題

[分享] numy中np.expand_dims方法的理解?

[複製鏈接]
跳轉到指定樓層
1#
發表於 2023-7-26 22:48:57 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
 
Push to Facebook
這個東西的主要作用,就是增加一個維度。

現在我們假設有一個數組A,數組A是一個兩行三列的矩陣。大小我們記成(2,3)。

先明白一個常識,計算機中計數,一般是從0開始的。

所以(2,3)這個兩行三列的矩陣,

它的第“0”維,就是這個“2”行;第“1”維,就是這個“3”列。

這個函數的作用,就是在第“axis”維,加一個維度出來,原先的“維”,推到右邊去。

比如我們設置axis為0,那A矩陣的大小就變成了(1,2,3),就從2*3的二維矩陣變成了一個1*2 *3的三維矩陣。如果設置axis為1,矩陣大小就變成了(2,1,3),變成了一個2*1*3的三維矩陣。axis為2的時候,就變成(2,3,1)啦。

那麼,說了這麼多,矩陣的形式變了,那麼矩陣裡面的數字怎麼變的呢?


舉個例子:

假設現在矩陣是2*3的矩陣,六個數字

1 2 3

4 5 6

初中和高中所學的平面直角坐標系和空間直角坐標系還記得嗎?

我們設置axis為0,矩陣從2*3的二維矩陣變成了1 * 2*3的三維矩陣。

我們假設原來是一個二維平面,橫坐標為x,縱坐標為y, 2*3的矩陣在這個XOY平面上。此時就是一個二維矩陣,(根本就沒有z軸)

而變換以後,現在變成了三維矩陣,變成了一個空間直角坐標系,,有x,y,z三個軸。

原先的2*3的矩陣從XOY平面移動到了YOZ平面

(我們把原先的矩陣當成一個平攤在桌面上的紙片,變換以後,相當於給它立起來了),然後原先的X軸的“厚度”為1,此時雖然形式還是原來的數字,但是多了一個軸。


那如果設置axis為1呢?

就是從XOY面的矩陣,給它立起來到XOZ平面,在Y軸的厚度為1。

設置axis為2,就是從XOY面的矩陣,還是放在XOY面上。但是這時候多了一個z軸,(相當於這個操作之後可以在桌面的紙片上面,疊加新的紙片了)

——————————————————————————————————

這時候我們再看矩陣

1 2 3

4 5 6

原先A[0][0]對應1,A[0][1]對應2,A[0][2]對應3,A[1][0]對應4……

如果設置axis為0,這時候矩陣從XOY平面移動到了YOZ平面,X軸只有一個值

那麼,變換後的矩陣A'的第一個維度,只有一個值,就只能是0

A'[0][0][0]是1,A[0][0][1]是2,A[0][0][2]是3

A'[0][1][0]是4,A[0][1][1]是5,A[0][1][2]是6

A'[0][0]不指定第三維,那麼就是[1,2,3]

A'[0][1]不指定第三維,就是[4,5,6]

那A[1][0][0]……呢?不好意思,沒有,因為第一維只能取一個數,就是0。

axis為1,2都同理。

函數格式如下:

  1. np.expand_dims(array, axis)
複製代碼


首先,我們需要理解axis(https:// blog.csdn.net/qq_358603 52/article/details/80463111)的意義,當axis=0時,我們從最外面的括號開始看,axis=0是最高維度,axis=1就是從左至右第二個括號所包含的內容,以此類推。

從例子理解:

1.我們先來看一維數組, axis = 0, 1, 2的情況

  1. import numpy as np
  2. a = np.array([1, 2, 3])
  3. print(a.shape)
  4. # a.shape(3,)
複製代碼

那麼,

(1)當axis = 0 時,我們從最高維擴展數組(增加它的維度),就給它在最外面再添個括號就可以啦。所以,

  1. b = np.expand_dims(a, axis=0)
  2. b = [[1, 2, 3]]
  3. b.shape = (1, 3)
複製代碼

shape(1,3)表示從左至右(從高維到低維:axis = 0 , 1)所包含內容的情況,axis = 0(最外面的括號)只包含一個內容:[1, 2, 3]; axis = 1(第二個括號)裡包含三個內容:1, 2,3。

(2)當axis = 1 時, 只有第0維有括號,所以當axis = 1就是給裡面的數加括號啦

  1. c = np.expand_dims(a, axis=1)
  2. c = [[1], [2], [3]]
  3. c.shape = (3, 1)
複製代碼

(3)當axis = 2時,我們可以發現,我們沒有地方加括號,所以它還是和axis=1的情況一樣。並且程序會提示:(以後會報錯)

DeprecationWarning: Both axis > a.ndim and axis < -a.ndim - 1 are deprecated and will raise an AxisError in the future.
————————————————————

2.我們再來看二維數組, axis = 0, 1, 2的情況

  1. import numpy as np
  2. a = np.array([[1, 2, 3], [4, 5, 6]])
  3. print(a.shape)
  4. # a.shape(2, 3)
複製代碼

那麼,

(1)當axis = 0 時,我們從最高維擴展數組(增加它的維度),就給它在最外面再添個括號就可以啦。所以,

  1. b = np.expand_dims(a, axis=0)
  2. b = [[[1, 2, 3], [4, 5, 6]]]
  3. b.shape = (1, 2, 3)
複製代碼

shape(1, 2, 3)表示從左至右(從高維到低維:axis = 0 , 1, 2)所包含內容的情況,axis = 0(最外面的括號)只包含1個內容:[[1, 2, 3], [4, 5, 6]]; axis = 1(第二個括號)裡包含2個內容:[1, 2, 3], [4, 5, 6]。axis = 3(第三個括號)裡包含3個內容:1, 2, 3;或4,5, 6

(2)當axis = 1 時,就是給第二個括號再加一個括號啦

  1. c = np.expand_dims(a, axis=1)
  2. c = [[[1, 2, 3]], [[4, 5, 6]]]
  3. c.shape = (2, 1, 3)
複製代碼

(3)當axis = 2 時,就是給最裡面的數加一個括號。

  1. d = np.expand_dims(a, axis=2)
  2. d = [[[1], [2], [3]], [[4], [5], [6]]]
  3. d.shape = (2, 3, 1)
複製代碼


參考文章
https://www.zhihu.com/question/265545749

 

臉書網友討論
*滑块验证:
您需要登錄後才可以回帖 登錄 | 註冊 |

本版積分規則



Archiver|手機版|小黑屋|免責聲明|TShopping

GMT+8, 2024-5-3 00:02 , Processed in 0.063047 second(s), 24 queries .

本論壇言論純屬發表者個人意見,與 TShopping綜合論壇 立場無關 如有意見侵犯了您的權益 請寫信聯絡我們。

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表