HOWTO · NumPy

在 Python 中將 3D 陣列轉換為 2D 陣列

NumPy 包的 reshape()函式可用於在 Python 中將 3D 陣列轉換為 2D 陣列。

本頁內容

使用 NumPy 的 numpy.reshape() 將 3D 陣列轉換為 2D 陣列,同時保留原有值。請選擇維度相乘後與輸入陣列元素總數相同的 2D 形狀。例如,形狀為 (4, 2, 2) 的陣列重新塑形為 (4, 4) 時,第一個軸上的每組值會保留在同一列,另外兩個軸則合併為欄。適合的分組方式取決於你如何解讀資料。

了解 3D 陣列的形狀

3D NumPy 陣列有三個軸,而 arr.shape 會以 tuple 回報各軸的長度。這些軸本身並不固定代表深度、高度和寬度;它們的意義取決於資料內容。例如,影像陣列可能以高度、寬度和色彩通道作為各軸,模擬資料則可能使用時間、列和欄。在重新塑形之前,先決定哪些維度要成為列,以及哪些維度要合併為欄。重新塑形會改變軸的組織方式,不會改變值本身。

使用 NumPy reshape() 將 3D 陣列轉換為 2D 陣列

呼叫 reshape() 時,傳入包含所需列數與欄數的 tuple。以下範例建立 0 到 15 的值,將它們排列成 (4, 2, 2) 陣列,再把最後兩個軸合併為四個欄。

執行此範例:

本節中的程式碼以及顯示的標籤或輸出仍為英文。

import numpy as np

arr = np.arange(16).reshape(4, 2, 2)
arr_2d = arr.reshape(4, 4)

print("Input shape:", arr.shape)
print("Output shape:", arr_2d.shape)
print(arr_2d)
Input shape: (4, 2, 2)
Output shape: (4, 4)
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]
 [12 13 14 15]]

目標形狀 (4, 4) 表示四列四欄。NumPy 會依照選定的索引順序保留各個值,因此新陣列的各列會根據所選軸來分組。若你的任務需要不同的分組方式,請改用其他目標形狀;並非每個 3D 資料集都適用同一種 2D 排列方式。

根據輸入陣列推導 2D 形狀

如果維度會變動,請從 arr.shape 讀取,而不要將維度寫死。若輸入形狀為 (a, b, c),且每個第一軸切片都應成為一列,輸出形狀就是 (a, b * c)。在程式碼中,設定 rows, height, width = arr.shape,再使用 arr.reshape(rows, height * width)。這會保留第一個軸,並合併第二與第三個軸。如果你希望列對應到其他軸,請先調整或轉置軸,再選擇符合該資料解讀方式的輸出形狀。

你也可以將其中一個維度寫成 -1,請 NumPy 自動推算,例如 arr.reshape(arr.shape[0], -1)。NumPy 會根據元素總數和其他已指定的維度計算該維度。一次只使用一個待推算的維度,才能讓目標形狀明確。

元素順序:C 與 Fortran 風格

預設情況下,reshape() 使用 C 風格的索引順序。也就是說,NumPy 讀取輸入值並放入結果時,最後一個軸變化最快。傳入 order='F' 則會使用 Fortran 風格的索引順序,此時第一個軸變化最快。order 參數控制重新塑形時採用的索引順序;它本身不保證特定的實體記憶體配置。大多數轉換使用預設值即可。只有當結果中的值需要依照 Fortran 慣例排列時,才選用 Fortran 順序。

形狀相容性與常見錯誤

輸入維度的乘積必須等於要求的輸出維度乘積。形狀為 (4, 2, 2) 的輸入有 16 個元素,因此 (4, 4) 或 (2, 8) 都能容納相同的值,但 (4, 5) 不行。如果要求的形狀與元素總數不相容,NumPy 會引發 ValueError。排查這個錯誤時,請檢查 arr.size 或計算各維度的乘積。另外,也要確認所選的列與欄分組符合資料的意義:形狀即使在數學上相容,值的排列方式仍可能不適合後續操作。

函式的參數和行為請參閱官方 NumPy reshape API 參考文件。