填充数组
在处理不同的数据时,往往会遇到数据尺寸或维度不同的情况,如果要让尺寸或维度相同,除了可以使用 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]]
'''
微信扫码关注
抖音扫码关注