API · NumPy

Python NumPy numpy.shape() 函式

使用 numpy.shape() 將陣列的維度作為 tuple 取得,或者從它的 .shape 屬性中讀取。

本頁內容

使用 NumPy 的 numpy.shape() 函式查看陣列的維度。它會傳回一個整數 tuple,其中每個值代表一個維度的長度。例如,(5, 3) 表示有五列、三欄。這個 tuple 描述輸入目前的形狀;tuple 是否不可變,並不會決定陣列本身能否重新塑形。

numpy.shape() 的語法

使用 numpy.shape(a) 呼叫函式,傳入要查看維度的值。必要引數 a 可以是 NumPy 陣列,也可以是其他類陣列值,例如巢狀序列。函式會依序為每個維度傳回一個整數,並將這些整數放在 tuple 中。一維輸入的 tuple 只有一個值;二維輸入的值分別表示列數和欄數;維度更高的輸入則會為每個額外的軸多出一個長度值。

numpy.shape() 範例

以下範例會建立一個二維 NumPy 陣列,並印出 numpy.shape() 傳回的維度。

import numpy as np

array = np.array([[11, 12, 5], [15, 6, 10], [10, 8, 12], [12, 15, 8], [34, 78, 90]])
print(np.shape(array))
(5, 3)

Tuple 的第一個值代表第一個軸,第二個值代表第二個軸,依此類推。對二維陣列來說,這些軸分別對應列與欄。當你需要確認資料的排列方式,再選擇軸或將資料傳給其他操作時,這個結果就很實用。

若陣列的單一軸上沒有任何值,其形狀就是 (0,)。包含 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20] 的一維陣列形狀為 (20,)。有五列、三欄的陣列形狀為 (5, 3);若三維陣列由三組資料組成,每組有兩列、每列三個值,形狀則為 (3, 2, 3)。這些 tuple 依序描述各軸的長度,不代表陣列中儲存的值。單一元素 tuple (20,) 中的逗號是 Python 語法,用來區分 tuple 與加上括號的整數。

這個 Python 範例會建立一個沒有值的陣列並取得其形狀。它沒有呼叫 print(),只是將形狀指定給變數,因此不會印出任何內容。

import numpy as np

empty_array = np.array([])
empty_shape = np.shape(empty_array)

此函式會回報輸入各維度的長度。如果結果與預期不同,請檢查輸入的建構方式,以及巢狀序列的排列順序。例如,規則的二維陣列中,形狀的第一個值是列數,第二個值是欄數。NumPy 會回報資料中實際存在的結構,不會推斷你預期的列標籤或欄標籤。對於不規則的巢狀資料,行為可能依 NumPy 版本和轉換規則而異;若需要一致的軸長度,請使用規則的陣列。

使用 .shape 屬性

NumPy 陣列也會透過 .shape 屬性提供維度資訊。對陣列 a 而言,a.shape 會提供與 numpy.shape(a) 相同的 tuple。若要將某個值傳給通用操作,請使用函式;若手邊已有陣列,想直接讀取其維度,則可使用屬性。存取屬性時不加括號;numpy.shape() 則是函式呼叫。

例如,若陣列有五列、三欄,a.shape 會回報 (5, 3),與 numpy.shape(a) 相同。兩種方式都只會回報維度,不會改變陣列。若重新塑形陣列,之後使用任一方式讀取,都會得到更新後的維度。除錯資料準備流程時,這項區別很實用:在操作之前先檢查形狀,確認軸的數量與順序是否符合預期,再利用傳回的 tuple 找出需要處理的維度。numpy.shape() 是函式;.shape 則是陣列的屬性。