NumPy reshape():如何在 Python 中重塑 NumPy 數組

已發表: 2022-04-20

在本教程中,您將學習如何使用NumPy reshape()在不更改原始數據的情況下重塑 NumPy 數組。

使用 Numpy 數組時,您可能經常希望將現有數組重塑為不同維度的數組。 當您在多個步驟中轉換數據時,這可能特別有用。

NumPy reshape()可以幫助您輕鬆完成。 在接下來的幾分鐘內,您將學習使用reshape()的語法,並將數組重塑為不同的維度。

什麼是 NumPy 數組中的重塑?

使用 NumPy 數組時,您可能首先要創建一個一維數字數組。 然後將其重塑為具有所需尺寸的數組。

當新數組的維度最初未知或在執行期間推斷時,這特別有用。 或者,某個數據處理步驟也可能要求輸入具有特定形狀。

這就是重塑派上用場的地方。

例如,考慮下圖。 我們有一個向量——一個由 6 個元素組成的一維數組。 我們可以將其重塑為 2×3、3×2、6×1 等形狀的數組。

numpy 重塑

️ 要按照本教程中的示例進行操作,您需要安裝 Python 和 NumPy。 如果您還沒有 NumPy,請查看我們的 NumPy 安裝指南。

您現在可以繼續並在別名np下導入 NumPy,方法是運行: import numpy as np

讓我們繼續學習下一節中的語法。

NumPy reshape() 的語法

下面是使用 NumPy reshape() 的語法:

 np.reshape(arr, newshape, order = 'C'|'F'|'A')
  • arr是任何有效的 NumPy 數組對象。 在這裡,它是要重塑的陣列。
  • newshape是新數組的形狀。 它可以是整數或元組。
  • newshape為整數時,返回的數組是一維的。
  • order是指您希望讀取要重新整形的數組元素的順序。
  • 默認值為'C',這意味著原始數組的元素將以類似C的索引順序(從0開始)讀取
  • “F”代表類似 Fortran 的索引(從 1 開始)。 'A'以類似 C 或類似 Fortran 的順序讀取元素,具體取決於數組arr的內存佈局。

那麼np.reshape()返回什麼?

如果可能,它會返回原始數組的重塑視圖。 否則,它會返回數組的副本

在上面一行中,我們提到 NumPy reshape()會盡可能嘗試返回視圖。 否則,它返回一個副本。 讓我們繼續討論視圖和副本之間的區別。

查看與 NumPy 數組的副本

顧名思義, copy是原始數組的副本。 對副本所做的任何更改都不會影響原始數組。

另一方面,視圖只是指原始陣列的重塑視圖。 這意味著對視圖所做的任何更改也會影響原始數組,反之亦然。

使用 NumPy reshape() 將一維數組重塑為二維數組

#1。 讓我們從使用 np.arange() 創建示例數組開始。

我們需要一個包含 12 個數字的數組,從 1 到 12,稱為 arr1。 由於 NumPy arange() 函數默認不包括端點,因此將停止值設置為 13。

現在讓我們使用上面的語法,將具有 12 個元素的arr1重塑為形狀為 (4,3) 的二維數組。 讓我們將此arr2稱為 4 行 3 列。

 import numpy as np arr1 = np.arange(1,13) print("Original array, before reshaping:\n") print(arr1) # Reshape array arr2 = np.reshape(arr1,(4,3)) print("\nReshaped array:") print(arr2)

讓我們看一下原始數組和重構數組。

 Original array, before reshaping: [ 1 2 3 4 5 6 7 8 9 10 11 12] Reshaped array: [[ 1 2 3] [ 4 5 6] [ 7 8 9] [10 11 12]]

除了將數組作為參數np.reshape() ,您還可以在原始數組上調用.reshape()方法。

您可以運行dir(arr1) ,它將列出您可以在數組對象arr1上使用的所有可能的方法和屬性。

 dir(arr1) # Output [ ... ... 'reshape' ... .. ]

在上面的代碼單元中,您可以看到.reshape()是在現有 NumPy 數組arr1上使用的有效方法。

️ 所以,你也可以使用下面的簡化語法來重塑 NumPy 數組。

 arr.reshape(d0,d1,...,dn) # where: # d0, d1,..,dn are the dimensions of the reshaped array # d0 * d1 * ...* dn = N, the number of elements in arr

對於本教程的其餘部分,讓我們在示例中使用此語法。

#2。 讓我們嘗試將我們的 12 元素向量重塑為 12 x 1 數組。

 import numpy as np arr1 = np.arange(1,13) print("Original array, before reshaping:\n") print(arr1) # Reshape array arr3 = arr1.reshape(12,1) print("\nReshaped array:") print(arr3)

在下面的輸出中,您可以看到數組已根據需要進行了重新整形。

 Original array, before reshaping: [ 1 2 3 4 5 6 7 8 9 10 11 12] Reshaped array: [[ 1] [ 2] [ 3] [ 4] [ 5] [ 6] [ 7] [ 8] [ 9] [10] [11] [12]]

那麼,我們如何檢查我們是否獲得了副本或視圖?

要檢查這一點,您可以調用返回數組的base屬性。

  • 如果數組是副本,則base屬性將為None
  • 如果數組是視圖,則base屬性將是原始數組。

讓我們快速驗證這一點。

 arr3.base # Output array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])

如您所見, arr3base屬性返回原始數組。 這意味著我們已經收到了原始數組的視圖

#3。 現在,讓我們嘗試將向量重塑為另一個有效的 2 x 6 數組。

 import numpy as np arr1 = np.arange(1,13) print("Original array, before reshaping:\n") print(arr1) # Reshape array arr4 = arr1.reshape(2,6) print("\nReshaped array:") print(arr4)

這是輸出:

 Original array, before reshaping: [ 1 2 3 4 5 6 7 8 9 10 11 12] Reshaped array: [[ 1 2 3 4 5 6] [ 7 8 9 10 11 12]]

在下一節中,讓我們將arr1重塑為 3D 數組。

使用 NumPy reshape() 將 1D 數組重塑為 3D 數組

要將arr1重塑為 3D 數組,讓我們將所需的維度設置為 (1, 4, 3)。

 import numpy as np arr1 = np.arange(1,13) print("Original array, before reshaping:\n") print(arr1) # Reshape array arr3D = arr1.reshape(1,4,3) print("\nReshaped array:") print(arr3D)

我們現在已經創建了一個 3D 數組,它具有與原始數組arr1相同的 12 個元素。

 Original array, before reshaping: [ 1 2 3 4 5 6 7 8 9 10 11 12] Reshaped array: [[[ 1 2 3] [ 4 5 6] [ 7 8 9] [10 11 12]]]

如何在重塑期間調試值錯誤

如果您還記得語法,那麼僅當維度的乘積等於數組中元素的數量時,整形才有效。

 import numpy as np arr1 = np.arange(1,13) print("Original array, before reshaping:\n") print(arr1) # Reshape array arr2D = arr1.reshape(4,4) print("\nReshaped array:") print(arr2D)

在這裡,您嘗試將一個 12 元素數組重塑為一個 4×4 數組,其中包含 16 個元素。 解釋器拋出一個值錯誤,如下所示。

 Original array, before reshaping: [ 1 2 3 4 5 6 7 8 9 10 11 12] ----------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-11-63552bcc8c37> in <module>() 6 7 # Reshape array ----> 8 arr2 = arr1.reshape(4,4) 9 print("\nReshaped array:") 10 print(arr2) ValueError: cannot reshape array of size 12 into shape (4,4)

為避免此類錯誤,您可以使用-1根據元素總數自動推斷其中一個維度的形狀。

例如,如果您事先知道 n – 1 個維度,則可以使用 -1 來推斷重構數組中的第 n 個維度。

如果您有一個 24 元素的數組,並且您想將其重塑為 3D 數組。 假設您需要 3 行和 4 列。 您可以沿第三個維度傳入 -1 的值。

 import numpy as np arr1 = np.arange(1,25) print("Original array, before reshaping:\n") print(arr1) # Reshape array arr_res = arr1.reshape(4,3,-1) print("\nReshaped array:") print(arr_res) print(f"Shape of arr_res:{arr_res.shape}")

當您檢查形狀數組的形狀時,您可以看到重新調整的數組沿第三維的形狀為 2。

 Original array, before reshaping: [ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24] Reshaped array: [[[ 1 2] [ 3 4] [ 5 6]] [[ 7 8] [ 9 10] [11 12]] [[13 14] [15 16] [17 18]] [[19 20] [21 22] [23 24]]] Shape of arr_res:(4, 3, 2)

這對於展平陣列特別有用。 您將在下一節中了解這一點。

使用 NumPy reshape() 展平數組

有時您需要從 N 維數組返回到扁平數組。 假設您要將圖像展平為一個長的像素向量。

讓我們使用以下步驟編寫一個簡單的示例:

  • 生成一個 3 x 3 灰度圖像數組img_arr — 像素範圍為 0 到 255。
  • 接下來,展平這個img_arr並打印出展平的數組flat_arr
  • 另外,打印出img_arrflat_arr的形狀進行驗證。
 img_arr = np.random.randint(0, 255, (3,3)) print(img_arr) print(f"Shape of img_arr: {img_arr.shape}") flat_arr = img_arr.reshape(-1) print(flat_arr) print(f"Shape of flat_arr: {flat_arr.shape}")

這是輸出。

 [[195 145 77] [ 63 193 223] [215 43 36]] Shape of img_arr: (3, 3) [195 145 77 63 193 223 215 43 36] Shape of flat_arr: (9,)

在上面的代碼單元中,您可以看到flat_arr是具有 9 個元素的像素值的一維向量。

加起來

是時候快速回顧一下我們學到的東西了。

  • 使用np.reshape(arr, newshape)arr重塑為newshape中指定的形狀。 newshape是一個元組,指定了重構數組的維度。
  • 或者,使用arr.reshape(d0, d1, ..., dn)arr重塑為形狀d0 x d1 x ... x dn
  • 檢查是否d0 * d1 * …* dn = N ,原始數組中的元素數,以避免在整形期間出現值錯誤。
  • 如果您希望自動推斷維度,則對新形狀中的最多一個維度使用-1
  • 最後,您可以使用arr.reshape(-1)來展平陣列。

現在您知道如何使用 NumPy reshape(),了解 NumPy linspace() 函數的工作原理。

如果您願意,可以嘗試 Jupyter notebook 中的代碼示例。 如果您正在尋找其他開發環境,請查看我們的 Jupyter 替代品指南。