博客
关于我
python中numpy.pad()函数的使用
阅读量:571 次
发布时间:2019-03-10

本文共 3154 字,大约阅读时间需要 10 分钟。

在卷积神经网络(CNN)中,为了避免卷积运算导致的输出图像缩小以及图像边缘信息丢失,开发者通常采用图像边缘填充技术。这种技术的核心在于在图像的四周边缘填充0,从而确保卷积运算后图像尺寸不会发生变化,同时保留边缘和角落的信息。在Python中,numpy库提供了一个强大的工具 --- 序列操作库numpy,特别是numpy.pad()函数,可以用来实现图像的边缘填充。

numpy.pad()的作用

numpy.pad()是一种极其强大的工具,常用于数据预处理,特别是在深度学习中。它可以将numpy数组按照指定的模式充填到指定的形状。这种填充操作对于图片数据的预处理特别重要,因为它能够确保图片数据在卷积运算前后尺寸保持一致。

numpy.pad()的基本使用方法

numpy.pad()的函数调用语法如下:

ndarray = numpy.pad(array, pad_width, mode, **kwargs)
  • array:表示需要填充的numpy数组。
  • pad_width:在每个维度上添加的填充宽度。输入格式为 :((before_1, after_1), …, (before_N, after_N))。每个元组表示在某一维度前面和后面需要填充的长度。
  • mode:填充模式,共有11种选择。
  • kwargs:填充值,与pad_width对应。需要注意的是,对于不同的填充模式,参数解析可能会有所不同。

常见的填充模式

根据不同的填充需求,numpy.pad() 提供了11种填充模式:

  • constant:在数组边缘填充相同的常数值。在多维数组中,每一维都可以独立指定填充值,常用的填充值前后可以有不同的值,默认为0。
  • edge:使用边缘值填充。对于一维数组,默认使用数组的第一个和最后一个元素作为填充值。对于多维数组,默认使用整个数组的边缘值填充。
  • linear_ramp:从数组边缘递增或递减地填充。在填充区域,填充的值会随着离边缘的距离逐渐变化。
  • maximum:填充最大值。
  • mean:填充均值。
  • median:填充中位数值。
  • minimum:填充最小值。
  • reflect:镜像填充,即根据对称分布反射边缘值填充。
  • symmetric:对称填充,镜像对称填充数组。
  • wrap:使用数组元素的循环填充,即前面的元素重复在后面,后面的元素重复在前面。
  • 示例1:一维数组填充

    让我们通过一维数组的填充操作来理解不同填充模式的效果:

    import numpy as nparr1D = np.array([1, 1, 2, 2, 3, 3, 4, 4])"""不同填充模式"""print('constant: ', np.pad(arr1D, (1, 2), 'constant'))print('edge: ', np.pad(arr1D, (1, 2), 'edge'))print('linear_ramp: ', np.pad(arr1D, (1, 2), 'linear_ramp'))print('maximum: ', np.pad(arr1D, (1, 2), 'maximum'))print('mean: ', np.pad(arr1D, (1, 2), 'mean'))print('median: ', np.pad(arr1D, (1, 2), 'median'))print('minimum: ', np.pad(arr1D, (1, 2), 'minimum'))print('reflect: ', np.pad(arr1D, (1, 2), 'reflect'))print('symmetric: ', np.pad(arr1D, (1, 2), 'symmetric'))print('wrap: ', np.pad(arr1D, (1, 2), 'wrap'))

    多维数组填充示例

    对于多维数组,填充操作的实现方式与一维数组类似,不过需要指定每个维度的填充宽度和填充模式:

    import numpy as nparr3D = 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。多维数组的填充值可以在各维度上单独指定。在以下示例中,我们可以看到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]]

    常数填充模式(constant)二维数组

    对于多维数组,复合填充值的使用可以自定义不同维度的填充值。在以下示例中,每行前后填充不同的常数值:

    arr2D = np.array([[1, 1], [2, 2]])ndarray = np.pad(arr2D, ((1,1), (2,2)), 'constant', constant_values=(0, 3))

    运行结果

    运行以上代码后,我们可以看到不同的填充模式在实际操作中的表现。

    转载地址:http://omfvz.baihongyu.com/

    你可能感兴趣的文章
    Objective-C实现SizeBalancedTree大小平衡树(附完整源码)
    查看>>
    Objective-C实现skew heap倾斜堆算法(附完整源码)
    查看>>
    Objective-C实现Skip List跳表算法(附完整源码)
    查看>>
    Objective-C实现slack message松弛消息算法(附完整源码)
    查看>>
    Objective-C实现SlopeOne算法(附完整源码)
    查看>>
    Objective-C实现slow sort慢排序算法(附完整源码)
    查看>>
    Objective-C实现tanh函数功能(附完整源码)
    查看>>
    Objective-C实现TCP Server 多线程同时连接多个客户端(附完整源码)
    查看>>
    Objective-C实现Tenengrad梯度函数(附完整源码)
    查看>>
    Objective-C实现ternary search三元搜索算法(附完整源码)
    查看>>
    Objective-C实现Timsort算法(附完整源码)
    查看>>
    Objective-C实现TOPK算法(附完整源码)
    查看>>
    Objective-C实现z-algorithm算法(附完整源码)
    查看>>
    Objective-C实现Zeller 的同余算法 (附完整源码)
    查看>>
    Objective-C实现zellers congruence泽勒一致算法(附完整源码)
    查看>>
    Objective-C实现Zero One Knapsack零一背包计算算法(附完整源码)
    查看>>
    Objective-C实现一个Pangram字符串至少包含一次所有字母算法(附完整源码)
    查看>>
    Objective-C实现一个stack算法(附完整源码)
    查看>>
    Objective-C实现一个通用的堆算法(附完整源码)
    查看>>
    Objective-C实现一分钟倒计时(附完整源码)
    查看>>