numpy.pad()函数使用详解

在卷积神经网络中,为了避免因为卷积运算导致输出图像缩小和图像边缘信息丢失,常常采用图像边缘填充技术,即在图像四周边缘填充0,使得卷积运算后图像大小不会缩小,同时也不会丢失边缘和角落的信息。在Python的numpy库中,常常采用numpy.pad()进行填充操作。

官方文档为:numpy.pad
numpy.pad(array, pad_width, mode=‘constant’, **kwargs)

参数解析

array

表示需要填充的数组。

pad_width

表示每个轴(axis)边缘需要填充的数值数目。
参数输入方式为:((before_1, after_1), … (before_N, after_N)),其中(before_1, after_1)表示第1轴两边缘分别填充before_1个和after_1个数值。

mode

表示填充的方式(取值:str字符串或用户提供的函数),总共有12种填充模式。
默认为’constant’方式填充。

**kwargs

表示关键字参数,它本质上是一个dict。
1、constant_values : sequence or scalar, optional。用于‘constant’填充方式指定的填充值。
2、stat_length : sequence or int, optional。用于 ‘maximum’, ‘mean’, ‘median’,和‘minimum’填充方式中。每个轴边缘用于计算统计量的数据个数,默认用到整个轴。
3、end_values : sequence or scalar, optional。用于 ‘linear_ramp’填充方式,设定结束值。
4、reflect_type : {‘even’, ‘odd’}, optional,默认为‘even’。

填充方式

1、‘constant’
表示连续填充相同的值,每个轴可以分别指定填充值,constant_values=(x, y)时前面用x填充,后面用y填充,缺省值填充0。

>>> a = [1, 2, 3, 4, 5]
>>> np.pad(a, (2, 3), 'constant', constant_values=(4, 6))
array([4, 4, 1, ..., 6, 6, 6])

2、‘edge’
用数组的边缘值填充。

np.pad(a, (2, 3), 'edge')
array([1, 1, 1, ..., 5, 5, 5])

3、‘linear_ramp’
表示用边缘递减的方式填充。

>>> np.pad(a, (2, 3), 'linear_ramp', end_values=(5, -4))
array([ 5,  3,  1,  2,  3,  4,  5,  2, -1, -4])

4、‘maximum’
表示最大值填充。

>>> np.pad(a, (2,), 'maximum')
array([5, 5, 1, 2, 3, 4, 5, 5, 5])

5、‘mean’
表示均值填充。

>>> np.pad(a, (2,), 'mean')
array([3, 3, 1, 2, 3, 4, 5, 3, 3])

6、‘median’
表示中位数填充。

>>> np.pad(a, (2,), 'median')
array([3, 3, 1, 2, 3, 4, 5, 3, 3])

设置统计长度。

>>> np.pad(a, (2,), 'median',stat_length=(2,3))
array([2, 2, 1, 2, 3, 4, 5, 4, 4])

7、‘minimum’
表示最小值填充。

>>> b = [[1, 2], [3, 4]]
>>> np.pad(b, ((3, 2), (2, 3)), 'minimum')
array([[1, 1, 1, 2, 1, 1, 1],
       [1, 1, 1, 2, 1, 1, 1],
       [1, 1, 1, 2, 1, 1, 1],
       [1, 1, 1, 2, 1, 1, 1],
       [3, 3, 3, 4, 3, 3, 3],
       [1, 1, 1, 2, 1, 1, 1],
       [1, 1, 1, 2, 1, 1, 1]])

8、‘reflect’
表示以边缘值为轴对称填充。

>>> a = [1, 2, 3, 4, 5]
>>> np.pad(a, (2, 3), 'reflect')
array([3, 2, 1, 2, 3, 4, 5, 4, 3, 2])

对于“odd”样式,数组的扩展部分是通过边缘值的两倍减去反射值来创建的。

>>> np.pad(a, (2, 3), 'reflect', reflect_type='odd')
array([-1,  0,  1,  2,  3,  4,  5,  6,  7,  8])

9、‘symmetric’
表示沿着边缘值对称填充。

>>> np.pad(a, (2, 3), 'symmetric')
array([2, 1, 1, 2, 3, 4, 5, 5, 4, 3])

对于“odd”样式,数组的扩展部分是通过边缘值的两倍减去反射值来创建的。

>>> np.pad(a, (2, 3), 'symmetric', reflect_type='odd')
array([0, 1, 1, 2, 3, 4, 5, 5, 6, 7])

10、‘wrap’
表示用原数组后面的值填充前面,前面的值填充后面。

>>> np.pad(a, (2, 3), 'wrap')
array([4, 5, 1, 2, 3, 4, 5, 1, 2, 3])

11、‘empty’
表示用未定义值填充,version 1.17新增。

>>> np.pad(a, (2, 3), 'empty')
array([1108, 0, 1, 2, 3, 4, 5, 0, 3, 2])

12、<function>
表示用自定义函数填充。padding_func(vector, iaxis_pad_width, iaxis, kwargs)

>>> def pad_with(vector, pad_width, iaxis, kwargs):
...     pad_value = kwargs.get('padder', 10)
...     vector[:pad_width[0]] = pad_value
...     vector[-pad_width[1]:] = pad_value
>>> a = np.arange(6)
>>> a = a.reshape((2, 3))
>>> np.pad(a, 2, pad_with)
array([[10, 10, 10, 10, 10, 10, 10],
       [10, 10, 10, 10, 10, 10, 10],
       [10, 10,  0,  1,  2, 10, 10],
       [10, 10,  3,  4,  5, 10, 10],
       [10, 10, 10, 10, 10, 10, 10],
       [10, 10, 10, 10, 10, 10, 10]])
>>> np.pad(a, 2, pad_with, padder=100)
array([[100, 100, 100, 100, 100, 100, 100],
       [100, 100, 100, 100, 100, 100, 100],
       [100, 100,   0,   1,   2, 100, 100],
       [100, 100,   3,   4,   5, 100, 100],
       [100, 100, 100, 100, 100, 100, 100],
       [100, 100, 100, 100, 100, 100, 100]])
发布了17 篇原创文章 · 获赞 30 · 访问量 1568

猜你喜欢

转载自blog.csdn.net/OuDiShenmiss/article/details/105618200
今日推荐