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。

更新於: 2023年8月10日

412 次檢視

啟動你的 職業生涯

透過完成課程獲得認證

開始學習
廣告