np.pad()详解

np.pad()用来在numpy数组的边缘进行数值填充,例如CNN网络常用的padding操作

1.语法结构

np.pad(array,pad_width,mode,**kwargs)  # 返回填充后的numpy数组

array:要填充的numpy数组【要对谁进行填充】

pad_width:每个轴要填充的数据的数目【每个维度前、后各要填充多少个数据】

mode:填充的方式【采用哪种方式填充】

备注:如何理解轴的概念?

轴是指行/列的堆叠方向

 

2. 参数pad_width解析

pad_width参数类型:sequence,array_like,int

pad_width参数格式:((before_1, after_1), (before_2, after_2), ... , (before_N, after_N))

第一个元素(before_1, after_1)表示第一维【列】的填充方式:前面填充before_1个数值,后面填充after_1个数值

第2个元素(before_2, after_2)表示第二维【行】的填充方式:前面填充before_2个数值,后面填充after_2个数值

... ...

备注:

(1)一维数组的rank = 1,所以对一维数组填充时,其pad_width参数只能是一个元组(before_1, after_1),当然也可以是一个int类型,表示前后填充的数值个数相同,例如

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

b = np.pad(a, 2, 'constant')  # 正确写法

c = np.pad(a, (2, 4), 'constant')  # 正确写法

d = np.pad(a, ((2, 4), (3, 5)), 'constant')  # 错误写法,因为a是一维数组,而(3, 5)表示在第二个维度进行填充

(2)二维数组的rank = 2,因此对二维数组填充时,其pad_width参数可以是两个并列的元组((before_1, after_1), (before_2, after_2)),但要注意将其合并为一个整体(即外加括号变成一个大元组)一起进行传参,

当然也可以是一个元组(before, after),表示两个维度都按照此方式填充;

当然也可以是一个int类型,表示两个维度前后填充的个数都相同;

例如

aa = np.arange(6).reshape(2, 3)

bb = np.pad(aa, 2, 'constant')  # 正确写法

cc = np.pad(aa, (2, 4), 'constant')  # 正确写法

dd = np.pad(aa, ((2, 4), (3, 5)), 'constant')  # 正确写法

ee = np.pad(aa, (2, 4), (3, 5), 'constant')  # 错误写法,必须将两个元组合成一个大元组传参

3.参数mode解析

mode参数类型:str(10种取值)、function

str类型取值包括:

  • ‘constant’——表示连续填充相同的值,每个轴可以分别指定填充值,constant_values=(x, y)时前面用x填充,后面用y填充,缺省值填充0
  • ‘edge’——表示用边缘值填充
  • ‘linear_ramp’——表示用边缘递减的方式填充
  • ‘maximum’——表示最大值填充
  • ‘mean’——表示均值填充
  • ‘median’——表示中位数填充
  • ‘minimum’——表示最小值填充
  • ‘reflect’——表示对称填充
  • ‘symmetric’——表示对称填充
  • ‘wrap’——表示用原数组后面的值填充前面,前面的值填充后面

4.参数kwargs解析

字典类型,key包括:

stat_length:sequence、int、optional,用在"maximum", "mean", "median", "minimum"中,默认值是 None

constant_values:sequence、int、optional,用在"constant"中,默认值是 0

end_values:sequence、int、optional,用在"linear_ramp"中,默认值是 0

reflect_type:{'even', 'old'},用在"reflect","symmetric"中

5.代码测试

 1 import numpy as np
 2 
 3 # 测试一维数组
 4 a = np.array([1, 2, 3, 4, 5])
 5 
 6 b = np.pad(a, 2, 'constant')
 7 print("b = ", b)
 8 
 9 c = np.pad(a, (2, 4), 'constant')
10 print("c = ", c)
11 
12 
13 # 测试二维数组
14 aa = np.arange(6).reshape(2, 3)
15 print("aa = 
", aa)
16 
17 bb = np.pad(aa, (2, 4), 'constant')
18 print("bb = 
", bb)
19 
20 cc = np.pad(aa, ((2, 4), (3, 5)), 'constant')
21 print("cc = 
", cc)
22 
23 
24 # 测试三维数组
25 aaa = np.arange(24).reshape(2, 3, 4)
26 print("aaa = 
", aaa)
27 
28 np.set_printoptions(threshold=np.inf) # 将numpy数组完全展开
29 bbb = np.pad(aaa, ((2, 3), (4, 5), (6, 7)), 'constant')# 块上加了2/3,列上加了4/5,行上加了6/7
30 print("bbb = 
", bbb)

运行结果如下:

b =  [0 0 1 2 3 4 5 0 0]
c =  [0 0 1 2 3 4 5 0 0 0 0]
aa = 
 [[0 1 2]
 [3 4 5]]
bb = 
 [[0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0]
 [0 0 0 1 2 0 0 0 0]
 [0 0 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 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0]]
cc = 
 [[0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 1 2 0 0 0 0 0]
 [0 0 0 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 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0]]
aaa = 
 [[[ 0  1  2  3]
  [ 4  5  6  7]
  [ 8  9 10 11]]

 [[12 13 14 15]
  [16 17 18 19]
  [20 21 22 23]]]
bbb = 
 [[[ 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0]
  [ 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0]
  [ 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0]
  [ 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0]
  [ 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0]
  [ 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0]
  [ 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0]
  [ 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0]
  [ 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0]
  [ 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0]
  [ 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0]
  [ 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0]]

 [[ 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0]
  [ 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0]
  [ 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0]
  [ 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0]
  [ 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0]
  [ 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0]
  [ 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0]
  [ 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0]
  [ 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0]
  [ 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0]
  [ 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0]
  [ 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0]]

 [[ 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0]
  [ 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0]
  [ 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0]
  [ 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0]
  [ 0  0  0  0  0  0  0  1  2  3  0  0  0  0  0  0  0]
  [ 0  0  0  0  0  0  4  5  6  7  0  0  0  0  0  0  0]
  [ 0  0  0  0  0  0  8  9 10 11  0  0  0  0  0  0  0]
  [ 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0]
  [ 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0]
  [ 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0]
  [ 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0]
  [ 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0]]

 [[ 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0]
  [ 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0]
  [ 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0]
  [ 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0]
  [ 0  0  0  0  0  0 12 13 14 15  0  0  0  0  0  0  0]
  [ 0  0  0  0  0  0 16 17 18 19  0  0  0  0  0  0  0]
  [ 0  0  0  0  0  0 20 21 22 23  0  0  0  0  0  0  0]
  [ 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0]
  [ 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0]
  [ 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0]
  [ 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0]
  [ 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0]]

 [[ 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0]
  [ 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0]
  [ 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0]
  [ 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0]
  [ 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0]
  [ 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0]
  [ 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0]
  [ 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0]
  [ 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0]
  [ 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0]
  [ 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0]
  [ 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0]]

 [[ 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0]
  [ 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0]
  [ 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0]
  [ 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0]
  [ 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0]
  [ 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0]
  [ 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0]
  [ 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0]
  [ 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0]
  [ 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0]
  [ 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0]
  [ 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0]]

 [[ 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0]
  [ 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0]
  [ 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0]
  [ 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0]
  [ 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0]
  [ 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0]
  [ 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0]
  [ 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0]
  [ 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0]
  [ 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0]
  [ 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0]
  [ 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0]]]

转载请注明博客出处:https://www.cnblogs.com/shuaishuaidefeizhu/p/14179038.html

原文地址:https://www.cnblogs.com/shuaishuaidefeizhu/p/14179038.html