实验楼 - Python Numpy 100题实验(二) pad()函数应用

题目描述:使用数字0将一个全为1的数组包围起来:
代码:

In [74]: a = np.ones((5,5))

In [75]: a
Out[75]:
array([[1., 1., 1., 1., 1.],
       [1., 1., 1., 1., 1.],
       [1., 1., 1., 1., 1.],
       [1., 1., 1., 1., 1.],
       [1., 1., 1., 1., 1.]])

In [76]: b = np.pad(a, pad_width=1, mode='constant', constant_values=0)

In [77]: b
Out[77]:
array([[0., 0., 0., 0., 0., 0., 0.],
       [0., 1., 1., 1., 1., 1., 0.],
       [0., 1., 1., 1., 1., 1., 0.],
       [0., 1., 1., 1., 1., 1., 0.],
       [0., 1., 1., 1., 1., 1., 0.],
       [0., 1., 1., 1., 1., 1., 0.],
       [0., 0., 0., 0., 0., 0., 0.]])

这一道题目的关键在于pad()函数,pad()函数作用是填充一个数组,因此经常用在图像矩阵的边缘填充中:

函数结构

pad(array, pad_width, mode, **kwars)

参数说明

  • array:将要进行填充的数组
  • pad_width:填充的各个方向的宽度,可以指定不同方向的宽度,如果只输入一个值,那么表示每个方向的填充宽度都一样
  • mode:填充的方式,可以取的值有 constant、edge等等
    其中,最为常用的填充方式就是 constant,表示连续填充相同的值,就比如在例题中所用的方式很显然就是这种
    constant_values可以指定填充的值
  • 其余的是一些不常用的可选参数

接下来看几个例子就很好理解了:

例如:

In [1]: import numpy as np

In [2]: a = np.ones((2,2), dtype=np.int)
In [3]: a
Out[3]:
array([[1, 1],
       [1, 1]])

# 设置填充的宽度方向不一致
In [4]: b = np.pad(a, pad_width=(1,2), mode='constant', constant_values=0)
In [5]: b
Out[5]:
array([[0, 0, 0, 0, 0],
       [0, 1, 1, 0, 0],
       [0, 1, 1, 0, 0],
       [0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0]])

#设置填充的值在不同方向上不一样
In [7]: c = np.pad(a, pad_width=1, mode='constant', constant_values=(3,4))
In [8]: c
Out[8]:
array([[3, 3, 3, 4],
       [3, 1, 1, 4],
       [3, 1, 1, 4],
       [3, 4, 4, 4]])

从上面的例子中我们可以看到,如果pad_width传入的参数是(a,b) 这种形式的,数组的“前面”的填充长度是a,“后面”的填充长度是b,这个前后在一维数组的填充中会比较明显:

In [9]: a = np.array([1,2,3])

In [10]: a
Out[10]: array([1, 2, 3])

In [11]: b = np.pad(a, pad_width=(1,2), mode='constant', constant_values=0)

In [12]: b
Out[12]: array([0, 1, 2, 3, 0, 0])

至于其他的填充方式,举几个例子:

In [14]: a
Out[14]: array([2, 3, 4])

# 边缘填充, 也就是用边缘值进行两侧填充
In [15]: b = np.pad(a, pad_width=2, mode='edge')
In [16]: b
Out[16]: array([2, 2, 2, 3, 4, 4, 4])

#最大值填充,不用指定填充值 使用数组的最大值进行填充
In [17]: c = np.pad(a, pad_width=2, mode='maximum')
In [18]: c
Out[18]: array([4, 4, 2, 3, 4, 4, 4])

#均值填充
In [19]: d = np.pad(a, pad_width=2, mode='mean')
In [20]: d
Out[20]: array([3, 3, 2, 3, 4, 3, 3])

#递减填充,按照两侧的规律进行递减到0填充  左侧 2->1->0  右侧 4->2->0 (等差到0)
In [21]: e = np.pad(a, pad_width=2, mode='linear_ramp')
In [22]: e
Out[22]: array([0, 1, 2, 3, 4, 2, 0])

以上~

猜你喜欢

转载自blog.csdn.net/sinat_34328764/article/details/82919099