HOWTO · NumPy
使用 numpy.newaxis 為 NumPy 陣列新增軸
numpy.newaxis 可用於向 Python 中的 NumPy 陣列新增新維度。
本頁內容
在索引運算式中使用 numpy.newaxis,會為陣列新增一個長度為 1 的軸。把它放在原有軸之前會形成列,放在該軸之後則會形成欄。對形狀為 (4,) 的一維陣列,這兩種寫法分別會得到 (1, 4) 和 (4, 1)。原始值的順序不變;索引會插入一個軸,因而改變陣列的形狀。
使用 numpy.newaxis 為 NumPy 陣列新增軸
在 NumPy 索引中,numpy.newaxis 是 Python None 物件的別名。它不是要加上括號呼叫的方法。numpy.newaxis 說明文件介紹了這個索引常數。在索引中,array[np.newaxis, :] 會把新軸放在最前面,而 array[:, np.newaxis] 會把新軸放在原有軸之後。冒號則會保留原有軸上的所有值。
安裝 NumPy 後即可執行此範例:
import numpy as np
values = np.array([1, 2, 3, 4])
print(values.shape)
row = values[np.newaxis, :]
column = values[:, np.newaxis]
print(row.shape)
print(column.shape)
(4,)
(1, 4)
(4, 1)
第一個形狀表示陣列有一個軸,包含四個項目。在列的寫法中,插入的第一個軸長度為 1,原有軸仍有四個項目。在欄的寫法中,原有的四項軸在前,插入的軸長度為 1。因此形狀會是 (1, 4) 和 (4, 1):形狀中的數值依軸的順序排列,表示的不是另一組值。二維形狀本身不會讓資料變成特殊的矩陣型別;NumPy 仍以陣列表示它。
同樣的兩種索引也可以用 None 表示:values[None, :] 會建立列的形狀,而 values[:, None] 會建立欄的形狀。請選擇較能讓周圍程式碼易讀的寫法。numpy.newaxis 也可以為已有多個維度的陣列新增軸。它在索引中的位置會決定新軸在結果形狀中的位置;在依賴後續運算前,先對照索引位置與形狀。
當其他運算需要維度對齊時,新增軸會很有用,包括某些廣播運算。新增的軸長度為 1;若其他維度相容,廣播可以擴展這個軸,但新增軸不會自動讓任意兩個陣列都相容。選擇列或欄時,先確認結果形狀以及下一個運算所需的軸順序。如此較容易推理索引結果,也能避免誤以為兩種寫法可以互換。
對於形狀為 (2, 3) 的陣列,matrix[:, :, None] 會在末端新增一個軸,形狀成為 (2, 3, 1);matrix[None, :, :] 則會在開頭新增一個軸,形狀成為 (1, 2, 3)。兩種情況下,原有兩個軸的順序與長度都不變。使用多個索引位置時,可以先寫下原始形狀,再標出每個 None 或 numpy.newaxis 的位置;在把陣列傳給其他函式前,就能據此預測新形狀。