NumPy reshape():如何在 Python 中重塑 NumPy 數組
已發表: 2022-04-20在本教程中,您將學習如何使用NumPy reshape()在不更改原始數據的情況下重塑 NumPy 數組。
使用 Numpy 數組時,您可能經常希望將現有數組重塑為不同維度的數組。 當您在多個步驟中轉換數據時,這可能特別有用。
NumPy reshape()
可以幫助您輕鬆完成。 在接下來的幾分鐘內,您將學習使用reshape()
的語法,並將數組重塑為不同的維度。
什麼是 NumPy 數組中的重塑?
使用 NumPy 數組時,您可能首先要創建一個一維數字數組。 然後將其重塑為具有所需尺寸的數組。
當新數組的維度最初未知或在執行期間推斷時,這特別有用。 或者,某個數據處理步驟也可能要求輸入具有特定形狀。
這就是重塑派上用場的地方。
例如,考慮下圖。 我們有一個向量——一個由 6 個元素組成的一維數組。 我們可以將其重塑為 2×3、3×2、6×1 等形狀的數組。

️ 要按照本教程中的示例進行操作,您需要安裝 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])
如您所見, arr3
的base
屬性返回原始數組。 這意味著我們已經收到了原始數組的視圖。
#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_arr
和flat_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 替代品指南。