填充陣列
在處理不同的資料時,往往會遇到資料尺寸或維度不同的情況,如果要讓尺寸或維度相同,除了可以使用 NumPy 改變陣列的尺寸,也可以使用「填充陣列」的方式,將特定的數值加入陣列中,進而增加陣列的長度,這篇教學將會介紹 numpy.pad() 填充陣列的方法。
本篇使用的 Python 版本為 3.7.12,所有範例可使用 Google Colab 實作,不用安裝任何軟體 ( 參考:使用 Google Colab )
填充模式
numpy.pad() 填充陣列時能設定填充模式,預設使用 constant 填充相同的數值 ( 預設 0 ),其他模式填入的最大值為原本陣列裡項目的最大值,最小值為 0,若陣列中項目最小值小於 0 則以陣列最小值作為最小值。
模式 | 說明 |
---|---|
constant | 連續填充相同值 ( 預設 ),預設填入 0,也可指定單一填充數值,或使用 (x,y) 表示左方空缺填入 x,右方空缺填入 y。 |
edge | 邊緣填充,右方空缺填入與最右方項目相同的值,左方空缺填入與最左方項目相同的值。 |
linear_ramp | 邊緣遞減,空缺處填入逐漸變小的值,直到最小值。 |
maximum | 最大值填充,空缺處填入原本陣列裡項目的最大值。 |
minimum | 最小值填充,空缺處填入原本陣列裡項目的最小值。 |
mean | 平均值填充,空缺處填入陣列項目的平均值。 |
median | 中位數填充,空缺處填入陣列項目的中位數。 |
reflect | 反射填充,空缺處填入與陣列項目鏡像反射的數值。 |
symmetric | 對稱填充,空缺處填入與陣列項目對稱的數值。 |
wrap | 包裹填充,空缺處填入與陣列重複同樣的數值。 |
填充一維陣列
一維陣列填充後,會自動在左側與右側擴展出指定的大小,下方的程式為預設的 constant 模式,可設定左右的擴展大小,以及填入的數值內容。
import numpy as np
a = np.array([-2,-1,0,1,2])
print(np.pad(a,5))
# 左右各多出五個空格,填入 0
# [ 0 0 0 0 0 -2 -1 0 1 2 0 0 0 0 0]
print(np.pad(a,5,constant_values = (5,8)))
# 左右各多出五個空格,左邊填入 5,右邊填入 8
# [ 5 5 5 5 5 -2 -1 0 1 2 8 8 8 8 8]
print(np.pad(a,(1,5)))
# 左邊多出一個空格,右邊多出五個空格,填入 0
# [ 0 -2 -1 0 1 2 0 0 0 0 0]
print(np.pad(a,(1,5),constant_values = (5,8)))
# 左邊多出一個空格,右邊多出五個空格,左邊填入 5,右邊填入 8
# [ 5 -2 -1 0 1 2 8 8 8 8 8]
下方列出不同填充模式下,填充後的陣列長相:
import numpy as np
a = np.array([-2,-1,0,1,2])
print(np.pad(a,5,mode='edge')) # [-2 -2 -2 -2 -2 -2 -1 0 1 2 2 2 2 2 2]
print(np.pad(a,5,mode='linear_ramp')) # [ 0 0 0 -1 -1 -2 -1 0 1 2 1 1 0 0 0]
print(np.pad(a,5,mode='maximum')) # [ 2 2 2 2 2 -2 -1 0 1 2 2 2 2 2 2]
print(np.pad(a,5,mode='mean')) # [ 0 0 0 0 0 -2 -1 0 1 2 0 0 0 0 0]
print(np.pad(a,5,mode='median')) # [ 0 0 0 0 0 -2 -1 0 1 2 0 0 0 0 0]
print(np.pad(a,5,mode='minimum')) # [-2 -2 -2 -2 -2 -2 -1 0 1 2 -2 -2 -2 -2 -2]
print(np.pad(a,5,mode='reflect')) # [ 1 2 1 0 -1 -2 -1 0 1 2 1 0 -1 -2 -1]
print(np.pad(a,5,mode='symmetric')) # [ 2 1 0 -1 -2 -2 -1 0 1 2 2 1 0 -1 -2]
print(np.pad(a,5,mode='wrap')) # [-2 -1 0 1 2 -2 -1 0 1 2 -2 -1 0 1 2]
填充多維陣列
一維陣列填充後,會自動在「上下左右」擴展出指定的大小,下方的程式為預設的 constant 模式,可設定上下左右的擴展大小 ( 設定的兩個數值的第一個表示左和上,第二個表示右和下 ),以及填入的數值內容 ( 設定的兩個數值的第一個表示左和上,第二個表示右和下 )。
import numpy as np
a = np.array([[1,1],[2,2]])
print(np.pad(a,2))
'''
[[0 0 0 0 0 0]
[0 0 0 0 0 0]
[0 0 1 1 0 0]
[0 0 2 2 0 0]
[0 0 0 0 0 0]
[0 0 0 0 0 0]]
'''
print(np.pad(a,2,constant_values = (5,8)))
'''
[[5 5 5 5 8 8]
[5 5 5 5 8 8]
[5 5 1 1 8 8]
[5 5 2 2 8 8]
[5 5 8 8 8 8]
[5 5 8 8 8 8]]
'''
print(np.pad(a,(1,2)))
'''
[[0 0 0 0 0]
[0 1 1 0 0]
[0 2 2 0 0]
[0 0 0 0 0]
[0 0 0 0 0]]
'''
print(np.pad(a,(1,2),constant_values = (5,8)))
'''
[[5 5 5 8 8]
[5 1 1 8 8]
[5 2 2 8 8]
[5 8 8 8 8]
[5 8 8 8 8]]
'''
下方列出不同填充模式下,填充後的陣列長相:
print(np.pad(a,2,mode='edge'))
'''
[[1 1 1 1 1 1]
[1 1 1 1 1 1]
[1 1 1 1 1 1]
[2 2 2 2 2 2]
[2 2 2 2 2 2]
[2 2 2 2 2 2]]
'''
print(np.pad(a,2,mode='linear_ramp'))
'''
[[0 0 0 0 0 0]
[0 0 0 0 0 0]
[0 0 1 1 0 0]
[0 1 2 2 1 0]
[0 0 1 1 0 0]
[0 0 0 0 0 0]]
'''
print(np.pad(a,2,mode='maximum'))
'''
[[2 2 2 2 2 2]
[2 2 2 2 2 2]
[1 1 1 1 1 1]
[2 2 2 2 2 2]
[2 2 2 2 2 2]
[2 2 2 2 2 2]]
'''
print(np.pad(a,2,mode='mean'))
'''
[[2 2 2 2 2 2]
[2 2 2 2 2 2]
[1 1 1 1 1 1]
[2 2 2 2 2 2]
[2 2 2 2 2 2]
[2 2 2 2 2 2]]
'''
print(np.pad(a,2,mode='median'))
'''
[[2 2 2 2 2 2]
[2 2 2 2 2 2]
[1 1 1 1 1 1]
[2 2 2 2 2 2]
[2 2 2 2 2 2]
[2 2 2 2 2 2]]
'''
print(np.pad(a,2,mode='minimum'))
'''
[[1 1 1 1 1 1]
[1 1 1 1 1 1]
[1 1 1 1 1 1]
[2 2 2 2 2 2]
[1 1 1 1 1 1]
[1 1 1 1 1 1]]
'''
print(np.pad(a,2,mode='reflect'))
'''
[[1 1 1 1 1 1]
[2 2 2 2 2 2]
[1 1 1 1 1 1]
[2 2 2 2 2 2]
[1 1 1 1 1 1]
[2 2 2 2 2 2]]
'''
print(np.pad(a,2,mode='symmetric'))
'''
[[2 2 2 2 2 2]
[1 1 1 1 1 1]
[1 1 1 1 1 1]
[2 2 2 2 2 2]
[2 2 2 2 2 2]
[1 1 1 1 1 1]]
'''
print(np.pad(a,2,mode='wrap'))
'''
[[1 1 1 1 1 1]
[2 2 2 2 2 2]
[1 1 1 1 1 1]
[2 2 2 2 2 2]
[1 1 1 1 1 1]
[2 2 2 2 2 2]]
'''
意見回饋
如果有任何建議或問題,可傳送「意見表單」給我,謝謝~