NumPy - 陣列重塑



重塑 NumPy 陣列

重塑 NumPy 陣列意味著改變其形狀,即修改每個維度上的元素數量,同時保持元素總數不變。換句話說,新形狀中維度的乘積必須等於原始形狀中維度的乘積。

例如,形狀為 (6,) 的陣列可以重塑為 (2, 3) 或 (3, 2),但不能重塑為 (2, 2),因為 6 個元素無法放入 2x2 的陣列中。

將一維陣列重塑為二維陣列

我們可以使用 NumPy 中的 reshape() 函式將一維陣列重塑為二維陣列。這用於將線性資料組織成矩陣形式。

reshape() 函式改變現有陣列的形狀而不改變其資料。以下是語法:

numpy.reshape(array, newshape)

其中:

  • array − 你想要重塑的陣列。

  • newshape − 你想要賦予陣列的形狀。它可以是整數或整數元組。一個維度可以是 -1,這意味著它將根據陣列的長度和其餘維度推斷出來。

示例:基本的重塑

在下面的示例中,我們使用 reshape() 函式將具有 6 個元素的一維陣列“arr”重塑為二維陣列:

import numpy as np

# Original 1-D array
arr = np.array([1, 2, 3, 4, 5, 6])

# Reshape to 2-D array 
reshaped_arr = arr.reshape((2, 3))
print("1-D to 2-D Array (2x3):")
print(reshaped_arr)

獲得的輸出如下:

1-D to 2-D Array (2x3):
[[1 2 3]
 [4 5 6]]

示例:重塑的實際用例

假設你有一組班級學生的考試成績列表,並且想要將它們組織成一個表格,其中每一行代表一個學生,每一列代表不同的考試。你可以透過將一維成績陣列重塑為二維陣列來實現這一點:

import numpy as np
# Original 1-D array of test scores
scores = np.array([85, 90, 78, 92, 88, 76])

# Reshape into a 2-D array where each row is a student's scores
scores_matrix = scores.reshape((2, 3))
print("Scores Matrix (2 students, 3 tests each):")
print(scores_matrix)

這將產生以下結果:

Scores Matrix (2 students, 3 tests each):
[[85 90 78]
 [92 88 76]]

將一維陣列重塑為三維陣列

我們也可以使用 reshape() 函式將一維陣列重塑為 NumPy 中的三維陣列。這有助於你表示更復雜的結構資料,例如多通道影像(例如 RGB 影像)、不同通道的時間序列資料或體資料。

示例

在這個示例中,我們使用 reshape() 函式將具有 12 個元素的一維陣列“arr”重塑為三維陣列:

import numpy as np

# Original 1-D array
arr = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])

# Reshape to 3-D array
reshaped_arr = arr.reshape((2, 2, 3))
print("1-D to 3-D Array (2x2x3):")
print(reshaped_arr)

上述程式碼的輸出如下:

1-D to 3-D Array (2x2x3):
[[[ 1  2  3]
  [ 4  5  6]]

 [[ 7  8  9]
  [10 11 12]]]

將 N 維陣列重塑為一維陣列

在 NumPy 中將 N 維 (N-D) 陣列重塑為一維 (1-D) 陣列是將多維陣列展平或摺疊成單個線性陣列的過程。我們也可以使用 reshape() 函式來實現這一點。

將複雜的多分量陣列展平為一維格式簡化了某些資料處理任務,並使資料更容易處理和分析。

示例

在下面的示例中,我們使用帶有 -1 引數的 reshape() 函式將形狀為 (2, 3) 的二維陣列“arr”重塑為一維陣列:

import numpy as np

# Original 2-D array
arr = np.array([[1, 2, 3], [4, 5, 6]])

# Reshape to 1-D array
reshaped_arr = arr.reshape(-1)
print("Reshaped Array:", reshaped_arr)

獲得的輸出如下:

Reshaped Array:[1 2 3 4 5 6]

重塑維度未知的陣列

你可以使用 NumPy 中的 reshape() 函式重塑維度未知的陣列。透過將-1作為引數傳遞給 reshape() 函式,NumPy 會根據陣列中的元素總數和其他指定的維度自動計算該維度的尺寸。

這有助於你重塑陣列,而無需顯式計算每個維度的確切大小。

示例

在下面的示例中,我們使用 reshape() 函式將具有 12 個元素的一維陣列 arr 重塑為三維陣列,並將其中一個維度指定為“-1”:

import numpy as np

# Original 1-D array
arr = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])

# Reshape to 3-D array with one unknown dimension
reshaped_arr = arr.reshape((2, 2, -1))
print("Reshaped Array with Unknown Dimension:")
print(reshaped_arr)

執行上述程式碼後,我們將獲得以下輸出:

Reshaped Array with Unknown Dimension:
[[[ 1  2  3]
  [ 4  5  6]][[ 7  8  9]
  [10 11 12]]]

重塑陣列時出現錯誤

在 NumPy 中重塑陣列有時會導致錯誤,尤其是在元素總數與指定維度的乘積不匹配時。務必確保新形狀與陣列中的元素數量相容。

重塑陣列時的常見錯誤

以下是 NumPy 中重塑陣列時最常見的錯誤:

  • ValueError: 新陣列的總大小必須保持不變 − 當原始陣列中的元素數量與為重塑指定的維度的乘積不匹配時,將發生此錯誤。

    例如,嘗試將 10 個元素的一維陣列重塑為 3x3 矩陣 (reshape((3, 3))) 將引發此錯誤,因為 3 × 3 = 9 與 10 不同。

  • ValueError: 無法將大小為 X 的陣列重塑為形狀 (Y, Z) − 此錯誤表明原始陣列大小 (X) 與指定的形狀 (Y, Z) 不相容。

    例如,嘗試將大小為 10 的一維陣列重塑為 2x5 矩陣 (reshape((2, 5))) 將引發此錯誤,因為 2 × 5 = 10,但陣列需要是二維的才能適合新形狀。

  • TypeError: 'numpy.ndarray' 物件無法解釋為整數 − 當為重塑提供的維度不是整數或指定不正確時,將發生此錯誤。確保傳遞給 reshape() 函式的所有維度都是有效的整數,並且它們正確地表示新形狀。

處理重塑陣列時的錯誤

以下是處理 NumPy 中重塑陣列時出現的錯誤的方法:

  • 檢查陣列大小 在重塑之前,使用 array.size() 函式驗證原始陣列的大小,並確保它與新形狀維度的乘積匹配。

  • 對未知維度使用 -1 重塑時,如果一個維度未知,請使用 -1 讓 NumPy 根據陣列中的元素總數和其它指定的維度自動計算它。

  • 捕獲異常 將你的重塑程式碼包裝在 try-except 塊中,以捕獲潛在的錯誤並優雅地處理它們。這可以防止你的程式崩潰,並允許進行適當的錯誤訊息或回退操作。

示例

在下面的示例中,我們嘗試將具有 5 個元素的一維陣列“arr”重塑為“2x3”二維陣列,這將導致 ValueError,因為元素總數與指定的形狀不匹配:

import numpy as np

# Original 1-D array
arr = np.array([1, 2, 3, 4, 5])

try:
   # Attempt to reshape to an incompatible shape
   reshaped_arr = arr.reshape((2, 3))
except ValueError as e:
   print("Error Occurred During Reshaping:")
   print(e)

獲得的錯誤如下:

Error Occurred During Reshaping:
cannot reshape array of size 5 into shape (2,3)
廣告