本文主要介绍数组的各种填充方法,包括数组按照原值复制扩大并填充,数组的扩大填充,数组边缘填充等。
1.数组的复制膨胀
形如二维数组:
[[1 2]
[3 4]]
膨胀为:
[[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 3 3 4 4 4]]
实现方法:
array=np.array([[1,2],[3,4]])
array2=np.kron(array, np.ones((2, 2), dtype=array.dtype))
2.数组的填充
Python编程中,当我们经常需要为数组进行填充时,numpy的np.pad函数提供了一个快速、高效的方法。
基本语法:
numpy.pad(array, pad_width, mode, **kwargs)
各参数的含义如下:
- array:需要填充的数组
- pad_width:填充的宽度,可以是单个整数、单个整数元组、或者是多个整数元组
- mode:填充模式,可以是常数、symmetric等
下面我们来进行测试:
2.1 一维数组填充
首先使用一维数组测试,代码如下:
array = np.array([1, 2, 3, 4, 5,6,7])
array2 = np.pad(a, (0, 5), 'constant', constant_values=(0, 0))
运行结果:array2 [1 2 3 4 5 6 7 0 0 0 0 0]
改为一下参数:
array2 = np.pad(array, (2, 5), 'constant', constant_values=(0, 0))
运行结果:array2 [0 0 1 2 3 4 5 6 7 0 0 0 0 0] 前面填充两个0,后面填充5个0.
前面填充8,后面填充9:
array2 = np.pad(array, (2, 5), 'constant', constant_values=(8, 9))
运行结果:array2 [8 8 1 2 3 4 5 6 7 9 9 9 9 9]
2.2 二维数组填充
示例:
array=np.array([[1,2,3],[4,5,6],[7,8,9]])
array2 = np.pad(array, ((2, 5),(2, 5)), 'constant', constant_values=(8, 9))
print('array2',array2)
运行结果:
array2
[[8 8 8 8 8 9 9 9 9 9]
[8 8 8 8 8 9 9 9 9 9]
[8 8 1 2 3 9 9 9 9 9]
[8 8 4 5 6 9 9 9 9 9]
[8 8 7 8 9 9 9 9 9 9]
[8 8 9 9 9 9 9 9 9 9]
[8 8 9 9 9 9 9 9 9 9]
[8 8 9 9 9 9 9 9 9 9]
[8 8 9 9 9 9 9 9 9 9]
[8 8 9 9 9 9 9 9 9 9]]
2.3 其他方式填充,边缘填充
除了常数模式之外,np.pad函数还支持其他几种填充模式,例如:
- symmetric:对称填充,填充部分是源数组的镜像
- edge:边缘填充,以数组的边缘元素进行填充
- minimum/maximum:最小值/最大值填充,将数组填充至源数组的最小值或最大值
我们也可以结合使用多种填充模式,例如进行边缘填充:
array=np.array([[1,2,3],[4,5,6],[7,8,9]])
array2 = np.pad(array, ((2, 2),(2, 2)), mode='edge')
print('array2',array2)
运行结果:array2
[[1 1 1 2 3 3 3]
[1 1 1 2 3 3 3]
[1 1 1 2 3 3 3]
[4 4 4 5 6 6 6]
[7 7 7 8 9 9 9]
[7 7 7 8 9 9 9]
[7 7 7 8 9 9 9]]
最大值填充:
array=np.array([[1,2,3],[4,5,6],[7,8,9]])
array2 = np.pad(array, ((2, 2),(2, 2)), mode='maximum')
print('array2',array2)
运行结果:array2
[[9 9 7 8 9 9 9]
[9 9 7 8 9 9 9]
[3 3 1 2 3 3 3]
[6 6 4 5 6 6 6]
[9 9 7 8 9 9 9]
[9 9 7 8 9 9 9]
[9 9 7 8 9 9 9]]
对于边缘填充,我们还可以采用如下方法:
import numpy as npdef array_expand(array,expand_size):# 获取原始数组尺寸height, width = array.shape# 创建新的扩展后的数组expanded_array = np.zeros((height + expand_size+1, width + expand_size+1), dtype=array.dtype)# 复制原始数组到新数组的内部区域expanded_array[1:-1, 1:-1] = array# 将原数组的上下左右四周扩展expanded_array[0, 1:-1] = array[0, :] # 复制第一行expanded_array[-1, 1:-1] = array[-1, :] # 复制最后一行expanded_array[1:-1, 0] = array[:, 0] # 复制第一列expanded_array[1:-1, -1] = array[:, -1] # 复制最后一列expanded_array[0, 0] = array[0, 0] # 左上角像素expanded_array[0, -1] = array[0, -1] # 右上角像素expanded_array[-1, 0] = array[-1, 0] # 左下角像素expanded_array[-1, -1] = array[-1, -1] # 右下角像素# 返回扩展后的数组return expanded_arrayarray=np.array([[1,2,3],[4,5,6],[7,8,9]])
windows_size=7
for i in range(0 ,windows_size//2):array = array_expand(array, 1)print(array)
windows_size是进行卷积运算时候窗口的大小。