python--numpy pad函数使用

在卷积神经网络中,为了充分利用图片边缘像素并防止图片尺寸缩小,使用 numpy 的 pad 函数进行填充。该函数支持多种填充方式,如常数填充、线性递减填充等。在处理三维数组时,填充主要针对 x 和 y 轴,对于 RGB 图片,实际是 x 和 z 轴。在应用时,通常只需对前两维进行填充操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

python--numpy pad函数使用

原文:https://blog.youkuaiyun.com/qq_29592167/article/details/81043640

        在卷积神经网络中,为了避免图片边缘像素点不能有效得到使用,同时,在卷积之后,图片被不断压缩的情况,我们有一个重要的操作叫做padding,翻译为填充,主要是通过在图片周围填充一定量的像素点来避免上述两种问题的产生。

如上图所示,红色区域为原始图像,我们需要将其周围做好填充,使其成为一个更大的图画,避免卷积结束后出现像素点的损失,从而避免了神经网络无法加深的问题。

        在python的numpy库函数中,该函数已经被封装好。

arr1D = np.array([1,2,3,4])

 

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

>>> arr1 = np.pad(arr1D, ((2,2)), 'constant')

>>> arr1

array([0, 0, 1, 2, 3, 4, 0, 0])

‘edge’——表示用边缘值填充

 

arr1 = np.pad(arr1D, ((2,2)), 'edge')

>>> arr1

array([1, 1, 1, 2, 3, 4, 4, 4])

‘linear_ramp’——表示用边缘递减的方式填充

>>> arr1 = np.pad(arr1D, ((2,2)), 'linear_ramp')

>>> arr1

array([0, 0, 1, 2, 3, 4, 2, 0])

‘maximum’——表示最大值填充

 

>>> arr1 = np.pad(arr1D, ((2,2)), 'maximum')

>>> arr1

array([4, 4, 1, 2, 3, 4, 4, 4])

‘mean’——表示均值填充

 

>>> arr1 = np.pad(arr1D, ((2,2)), 'mean')

>>> arr1

array([2, 2, 1, 2, 3, 4, 2, 2])

‘median’——表示中位数填充

>> arr1 = np.pad(arr1D, ((2,2)), 'median')

>>> arr1

array([2, 2, 1, 2, 3, 4, 2, 2])

‘minimum’——表示最小值填充

>>> arr1 = np.pad(arr1D, ((2,2)), 'minimum')

>>> arr1

array([1, 1, 1, 2, 3, 4, 1, 1])

‘reflect’——表示对称填充

>>> arr1 = np.pad(arr1D, ((2,2)), 'reflect')

>>> arr1

array([3, 2, 1, 2, 3, 4, 3, 2])

>>> arr1 = np.pad(arr1D, ((3,3)), 'reflect')

>>> arr1

array([4, 3, 2, 1, 2, 3, 4, 3, 2, 1])

 
  1.  
  2. >>> arr1 = np.pad(arr1D, ((4,4)), 'reflect')

  3. >>> arr1

  4. array([3, 4, 3, 2, 1, 2, 3, 4, 3, 2, 1, 2])

‘symmetric’——表示对称填充

 
  1. >>> arr1 = np.pad(arr1D, ((2,2)), 'symmetric')

  2. >>> arr1

  3. array([2, 1, 1, 2, 3, 4, 4, 3])

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

 
  1. >>> arr1 = np.pad(arr1D, ((2,2)), 'wrap')

  2. >>> arr1

  3. array([3, 4, 1, 2, 3, 4, 1, 2])

        但是如何调用还是要注意,首先,卷积操作基于整个图像,而通常一副彩色图是由三个二维矩阵组成的立体三维数组,所以,卷积核也是三维的,相应的,卷积运算就在两个维度上展开,卷积核的移动式向右,向下,再向右,向下,直到图片遍历结束为止,因此,我们的填充操作只在两个轴上进行,也就是我们通常意义的x轴和y轴,但问题的关键在于,当我们在python中,用np.array定义了一个三维数组之后,怎么把每一个纬度映射到我们通常所理解的三维图片上呢!这块是我个人的理解,不知道对不对,理论上一幅图,我们是要在x和y轴两个方向上做改变,但是,如果将三色图看成一个立体的,我们的改变实际上发生在x和z两个方向上,如果我们将每种通道的像素值(RGB)分别存储在一个二维数组里,就得到了一个三维数组,而对应的纬度计算时shape的第一个值与图片的表示正好相反,所以,需要我们对后两位进行作用。

如图所示,不过,一般的数据集都会考虑到这一点,所以,在操作数据集的时候,坐标顺序表示依然是正确的,只需要作用前两位填充即可。

### Numpy Pad 函数详解 `numpy.pad` 是 NumPy 库中的一个重要函数,用于通过指定的方式填充数组的边界。这种操作在图像处理、信号处理以及机器学习等领域非常常见。 以下是 `numpy.pad` 的基本语法及其主要参数说明: #### 基本语法 ```python numpy.pad(array, pad_width, mode='constant', **kwargs) ``` - **array**: 要填充的原始数组。 - **pad_width**: 指定每条轴上的填充宽度。可以是一个整数(表示所有边都填充相同的宽度)、一个元组 `(before, after)` 或者一个列表 `[...]` 来分别控制不同轴的前后填充宽度[^1]。 - **mode**: 填充模式,默认为 `'constant'`。支持多种模式,包括但不限于: - `'constant'`: 使用常数值填充(默认值为 0)。可以通过 `constant_values` 参数设置具体值。 - `'edge'`: 使用边缘值重复填充。 - `'linear_ramp'`: 创建线性渐变填充。 - `'maximum'`, `'mean'`, `'minimum'`: 使用窗口内的最大值、均值或最小值填充。 - `'reflect'`, `'symmetric'`: 反射或对称方式填充。 - **kwargs**: 不同模式可能需要额外的关键字参数,例如对于 `'constant'` 模式可提供 `constant_values`。 #### 示例代码 以下是一些常见的使用场景示例: ##### 1. 常数填充 (`constant`) ```python import numpy as np arr = np.array([[1, 2], [3, 4]]) padded_arr = np.pad(arr, ((1, 1), (2, 2)), 'constant', constant_values=7) print(padded_arr) ``` 输出结果如下: ``` [[7 7 7 7 7 7] [7 7 1 2 7 7] [7 7 3 4 7 7] [7 7 7 7 7 7]] ``` ##### 2. 边缘值填充 (`edge`) ```python padded_edge = np.pad(arr, ((1, 1), (2, 2)), 'edge') print(padded_edge) ``` 输出结果如下: ``` [[1 1 1 2 2 2] [1 1 1 2 2 2] [1 1 1 2 2 2] [3 3 3 4 4 4] [3 3 3 4 4 4]] ``` ##### 3. 对称反射填充 (`symmetric`) ```python padded_symm = np.pad(arr, ((1, 1), (2, 2)), 'symmetric') print(padded_symm) ``` 输出结果如下: ``` [[2 1 1 2 4 4 3] [2 1 1 2 4 4 3] [1 1 1 2 4 4 4] [3 3 3 4 4 4 4] [2 2 3 4 4 3 3]] ``` #### 注意事项 - 如果未显式指定 `constant_values`,则默认使用 0 进行填充。 - 当 `pad_width` 设置过大时可能会超出内存限制,需谨慎调整大小。 - 不同的 `mode` 参数会对性能产生一定影响,在实际应用中应根据需求合理选择。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值