python中numpy.pad()函数的使⽤
在卷积神经⽹络中,为了避免因为卷积运算导致输出图像缩⼩和图像边缘信息丢失,常常采⽤图像边缘填充技术,即在图像四周边缘填充0,使得卷积运算后图像⼤⼩不会缩⼩,同时也不会丢失边缘和⾓落的信息。在Python的numpy库中,常常采⽤numpy.pad()进⾏填充操作。
numpy.pad() 常⽤于深度学习中的数据预处理,可以将numpy数组按指定的⽅法填充成指定的形状。
语法结构
ndarray = numpy.pad(array, pad_width, mode,**kwargs)
其中,array表⽰需要填充的数组;
英语国际音标学习 pad_width表⽰在各维度的各个⽅向上想要填补的长度。参数输⼊⽅式为: ((before_1, after_1), … (before_N, after_N));
mode表⽰填充的⽅式,总共有11种填充模式;
**kwargs表⽰填充的值,与pad_width相对应。
填充模式
constant表⽰连续填充相同的值,每个维度可以分别指定填充值,constant_values=(x, y)时前⾯⽤x填充,后⾯⽤y填充,缺省值填充0;
edge表⽰⽤边缘值填充;
linear_ramp表⽰⽤边缘递减的⽅式填充;
maximum表⽰最⼤值填充;
mean表⽰均值填充;
median表⽰中位数填充;
minimum表⽰最⼩值填充;
reflect表⽰对称填充;
symmetric表⽰对称填充;
wrap表⽰⽤原数组后⾯的值填充前⾯,前⾯的值填充后⾯。
examples1: ⽤不同的填充模式对⼀维数组进⾏填充:
美白小窍门import numpy as np
arr1D = np.array([1,1,2,2,3,3,4,4])
'''不同的填充模式'''
学美留学print('constant: '+str(np.pad(arr1D,(1,2),'constant')))
百万瓦特
print('edge: '+str(np.pad(arr1D,(1,2),'edge')))
print('linear_ramp: '+str(np.pad(arr1D,(1,2),'linear_ramp')))
print('maximum: '+str(np.pad(arr1D,(1,2),'maximum')))
print('mean: '+str(np.pad(arr1D,(1,2),'mean')))
print('median: '+str(np.pad(arr1D,(1,2),'median')))
print('minimum: '+str(np.pad(arr1D,(1,2),'minimum')))
print('reflect: '+str(np.pad(arr1D,(1,2),'reflect')))
print('symmetric: '+str(np.pad(arr1D,(1,2),'symmetric')))
print('wrap: '+str(np.pad(arr1D,(1,2),'wrap')))
不同模式填充结果:
constant: [0 1 1 2 2 3 3 4 4 0 0]
edge: [1 1 1 2 2 3 3 4 4 4 4]
linear_ramp: [0 1 1 2 2 3 3 4 4 2 0]
maximum: [4 1 1 2 2 3 3 4 4 4 4]
mean: [2 1 1 2 2 3 3 4 4 2 2]
median: [2 1 1 2 2 3 3 4 4 2 2]
minimum: [1 1 1 2 2 3 3 4 4 1 1]
reflect: [1 1 1 2 2 3 3 4 4 4 3]
symmetric: [1 1 1 2 2 3 3 4 4 4 4]
wrap: [4 1 1 2 2 3 3 4 4 1 1]
examples2: ⽤不同的填充模式对多维数组进⾏填充:
import numpy as np
arr3D = np.array([[[1,1,2,2,3,4],[1,1,2,2,3,4],[1,1,2,2,3,4]],
[[0,1,2,3,4,5],[0,1,2,3,4,5],[0,1,2,3,4,5]],
[[1,1,2,2,3,4],[1,1,2,2,3,4],[1,1,2,2,3,4]]])
'''不同的填充模式'''
print('constant: \n'+str(np.pad(arr3D,((0,0),(1,1),(2,2)),'constant')))
print('edge: \n'+str(np.pad(arr3D,((0,0),(1,1),(2,2)),'edge')))
print('linear_ramp: \n'+str(np.pad(arr3D,((0,0),(1,1),(2,2)),'linear_ramp'))) print('maximum: \n'+str(np.pad(arr3D,((0,0),(1,1),(2,2)),'maximum'))) print('mean: \n'+str(np.pad(arr3D,((0,0),(1,1),(2,2)),'mean')))
print('median: \n'+str(np.pad(arr3D,((0,0),(1,1),(2,2)),'median')))
print('minimum: \n'+str(np.pad(arr3D,((0,0),(1,1),(2,2)),'minimum'))) print('reflect: \n'+str(np.pad(arr3D,((0,0),(1,1),(2,2)),'reflect')))
print('symmetric: \n'+str(np.pad(arr3D,((0,0),(1,1),(2,2)),'symmetric'))) print('wrap: \n'+str(np.pad(arr3D,((0,0),(1,1),(2,2)),'wrap')))
constant填充模式的结果如下(其他模式的运⾏结果省略):
constant:
[[[0 0 0 0 0 0 0 0 0 0]
[0 0 1 1 2 2 3 3 0 0]
[0 0 1 1 2 2 3 3 0 0]
[0 0 1 1 2 2 3 3 0 0]
[0 0 0 0 0 0 0 0 0 0]]
[[0 0 0 0 0 0 0 0 0 0]chlamydia
[0 0 0 1 2 3 4 5 0 0]
[0 0 0 1 2 3 4 5 0 0]
[0 0 0 1 2 3 4 5 0 0]
[0 0 0 0 0 0 0 0 0 0]]
[[0 0 0 0 0 0 0 0 0 0]
[0 0 4 4 5 5 6 6 0 0]
[0 0 4 4 5 5 6 6 0 0]
[0 0 4 4 5 5 6 6 0 0]
[0 0 0 0 0 0 0 0 0 0]]]
examples3: 使⽤constant填充模式对⼀维数组填充。
import numpy as np
arr1D = np.array([1,2,3])
ndarray=np.pad(arr1D,(1,2),'constant', constant_values=(0,2))
come clean# (1,2)表⽰在⼀维数组array前⾯填充1位,最后⾯填充2位
# constant_values=(0,2) 表⽰前⾯填充0,后⾯填充2
print("arr1D=",arr1D)
print("ndarray=",ndarray)
运⾏结果:
arr1D= [1 2 3]
ndarray= [0 1 2 3 2 2]
blind
examples4: 使⽤constant填充模式对多维数组填充。
import numpy as np
arr2D = np.array([[1,1],[2,2]])
"""
rage((1,1),(2,2))表⽰在⼆维数组array第⼀维(此处便是⾏)前⾯填充1⾏,最后⾯填充1⾏;冤情
在⼆维数组array第⼆维(此处便是列)前⾯填充2列,最后⾯填充2列constant_values=(0,3) 表⽰第⼀维填充0,第⼆维填充3
"""
ndarray=np.pad(arr2D,((1,1),(2,2)),'constant', constant_values=(0,3))
print("arr2D=",arr2D)
print("ndarray=",ndarray)
运⾏结果:
arr2D= [[1 1]
[2 2]]
ndarray= [[0 0 0 0 3 3]leather
[0 0 1 1 3 3]
[0 0 2 2 3 3]
[0 0 3 3 3 3]]