NumPy 中 reshape() 和 resize() 方法的區別
NumPy 陣列的大小可以透過 Python 中的兩個函式(reshape 和 resize)來改變。它們之間只有一個區別,即使用 resize() 時原始陣列保持不變,而 reshape() 僅返回更改後的陣列,原始陣列保持不變。
語法
Reshape()
reshape(x,y)
在此語法中,x 指定要從提供的較大的輸入陣列中建立的較小陣列的數量,y 表示陣列中存在的元素的實際數量。
如果值是實際的,則該方法返回一個修改後的陣列,如果陣列無法細分為指定數量的較小陣列,則返回錯誤。
Resize()
resize(x,y)
在確定 x 和 y 引數時,該函式與 reshape() 函式非常相似。返回模式也保持相同。
此外,原始陣列會永久更改。
示例 1
這解釋了 reshape() 屬性用於運算元組特徵的使用。在此示例中,一個包含 8 個元素的陣列被重新整形,使其被劃分為 4 個較小的陣列,每個陣列包含 2 個元素。
演算法
步驟 1:匯入 numpy 為 np
步驟 2:從給定陣列建立 NumPy 陣列。
步驟 3:透過傳遞每個較小陣列中的元素數量和此類較小陣列的數量來使用 reshape 函式。
步驟 4:列印陣列。
示例
#import numpy import numpy as np #create a numpy array with values of the array. data = np.array([10, 20, 30, 40, 50, 60, 70, 80]) #print the contents of the original numpy array print("Original array: ") display(data) #reshape the array into a 4x2 matrix and display it. print("Reshaped array: ") display(data.reshape(4, 2)) #print the original array print("Original array:") display(data)
輸出
Original array: array([10, 20, 30, 40, 50, 60, 70, 80]) Reshaped array: array([[10, 20], [30, 40], [50, 60], [70, 80]])
從輸出中,我們可以看到即使在使用 reshape() 之後,原始陣列也保持不變。更改是在緩衝區陣列中進行的,該陣列具有所需的維度。
示例 2
此程式碼解釋了 resize() 屬性用於運算元組特徵的使用。這裡,一個包含 8 個元素的陣列被調整大小,使其被劃分為 4 個數組,每個陣列包含 2 個元素。請注意,更改是在原始陣列本身中進行的。
演算法
步驟 1:匯入 numpy 為 np
步驟 2:從給定陣列建立 NumPy 陣列。
步驟 3:透過傳遞每個較小陣列中的元素數量和此類較小陣列的數量來使用 resize 函式。
步驟 4:列印陣列。
示例
#import numpy import numpy as np #create a numpy array with values of the array data = np.array([10, 20, 30, 40, 50, 60, 70, 80]) #print the contents of the original array print("Original array: ") display(data) #resize the array into a 4x2 matrix print("Resized array: ") display(data.resize(4, 2)) #print the original array print("Original array:") display(data)
輸出
Original array: array([10, 20, 30, 40, 50, 60, 70, 80]) Resized array: None Original array: array([[10, 20], [30, 40], [50, 60], [70, 80]])
我們可以觀察到,沒有單獨提供的調整大小的陣列,並且原始陣列本身被操作以匹配使用者在 resize 函式中作為引數提到的維度。
主要區別
屬性 | Reshape | Resize |
---|---|---|
功能 | 如果陣列不能被細分為指定的子陣列數量,則 reshape 屬性會丟擲 ValueError。每當陣列缺少足夠的元素時,都會觀察到 ValueError。 | 對於 reshape 屬性,它會新增 0 來填充陣列,使其正好可以被使用者提到的片段數量整除。 |
就地切換 | 對於 reshape(),會建立現有陣列的副本,並將維度更改應用於陣列的副本。因此,原始陣列的維度沒有變化 | resize() 方法使用就地修改,因此原始陣列會被覆蓋。 |
結論
在不需要保留原始陣列的情況下,可以使用 reshape() 或 resize() 這兩種方法。但是,如果傳遞給函式的引數與陣列的實際大小不匹配,或者陣列缺少那麼多元素,則會引發錯誤。
如果必須保持原始陣列不變,則首選 Reshape 而不是 Resize。