Python +numpy数组膨胀(填充)方法总结

本文主要介绍数组的各种填充方法,包括数组按照原值复制扩大并填充,数组的扩大填充,数组边缘填充等。

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 np

def 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_array


array=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是进行卷积运算时候窗口的大小。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

空中旋转篮球

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值