np.pad()详解

👨‍💻个人简介: 深度学习图像领域工作者,5年工作经验(目标检测、分割、分类、Matting)
🎉总结链接:
             链接中主要是个人工作的总结,每个链接都是一些常用demo,代码直接复制运行即可。包括:
                    📌1.工作中常用深度学习脚本
                    📌2.torch、numpy等常用函数详解
                    📌3.opencv 图片、视频等操作
                    📌4.个人工作中的项目总结(纯干活)
              链接: https://blog.csdn.net/qq_28949847/article/details/128552785
🎉视频讲解: 以上记录,通过B站等平台进行了视频讲解使用,可搜索 ‘Python图像识别’ 进行观看
              B站:Python图像识别
              抖音:Python图像识别
              西瓜视频:Python图像识别


1. 作用:

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

2. 语法结构

np.pad(array,pad_width,mode,**kwargs)  

2.1 参数说明:

array:要填充的numpy数组【要对谁进行填充】
pad_width:每个轴要填充的数据的数目【每个维度前、后各要填充多少个数据】
mode:填充的方式【采用哪种方式填充】

2.1.1 参数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个数值
… …

2.1.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')  # 错误写法,必须将两个元组合成一个大元组传参

2.2 参数mode解析

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

str类型取值包括:

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

2.3 如何理解轴的概念?

轴是指行/列的堆叠方向

在这里插入图片描述

3. 测试代码:

import numpy as np

# 测试一维数组
a = np.array([1, 2, 3, 4, 5])

b = np.pad(a, 2, 'constant')
print("b = ", b)

c = np.pad(a, (2, 4), 'constant')
print("c = ", c)


# 测试二维数组
aa = np.arange(6).reshape(2, 3)
print("aa = \n", aa)

bb = np.pad(aa, (2, 4), 'constant')
print("bb = \n", bb)

cc = np.pad(aa, ((2, 4), (3, 5)), 'constant')
print("cc = \n", cc)


# 测试三维数组
aaa = np.arange(24).reshape(2, 3, 4)
print("aaa = \n", aaa)

np.set_printoptions(threshold=np.inf) # 将numpy数组完全展开
bbb = np.pad(aaa, ((2, 3), (4, 5), (6, 7)), 'constant')# 块上加了2/3,列上加了4/5,行上加了6/7
print("bbb = \n", bbb)
<think>好的,我需要帮助用户了解pad函数的用法和实现方式。首先,用户提到了多个引用,包括PyTorch、TensorFlow和NumPypad函数,所以我要分别解释这三个框架中的pad函数用法。 首先,我应该整理每个引用中的信息。比如,引用[1]提到PyTorch的F.pad函数,参数包括input、pad、mode和value。引用[2]是关于TensorFlow的tf.pad,参数类似但可能有不同的模式。引用[3]-[5]是关于NumPynp.pad,特别是不同填充模式的示例,比如constant、linear_ramp等。 接下来,我需要分框架来讲解,每个部分的结构要清晰。例如,先讲PyTorch,然后是TensorFlow,最后是NumPy。每个部分需要说明函数原型、参数意义以及示例,这样用户能清楚不同框架下的使用差异。 然后,关于实现方式,用户可能想知道底层是如何实现的。这时候需要解释常见的填充逻辑,比如如何计算填充大小,不同模式的处理方式。例如,constant模式用固定值填充,reflect模式镜像反射边界值。可能还需要提到这些函数的实现可能涉及底层的C或CUDA代码优化,但具体实现细节用户通常不需要关心,而应使用官方API。 同时,需要注意用户提到的示例代码,比如NumPy中的例子,应该结合这些例子来说明参数如何影响结果。例如,在constant_values参数中,不同的值如何改变填充结果。 另外,用户的问题还要求生成相关问题,我需要考虑用户可能进一步想了解的内容,比如不同框架之间的对比,常见错误,或者性能方面的考虑。例如,如何选择填充模式,不同模式的适用场景,或者处理多维数组时的注意事项。 最后,确保回答符合系统级指令,比如使用中文,数学公式正确应用$...$,独立公式用$$...$$,但在这个问题中可能数学公式不多,但如果有的话需要正确格式化。同时引用标识要正确添加到对应的引用位置,比如在PyTorch部分末尾加上[^1],TensorFlow加[^2],NumPy加[^3]、[^4]、[^5]。 总结步骤: 1. 分框架介绍pad函数的用法,包括函数原型、参数、示例。 2. 解释实现方式的一般逻辑,不同填充模式的处理方法。 3. 生成相关问题,涵盖不同框架对比、参数使用、应用场景等。 确保引用正确,结构清晰,符合用户的格式要求。</think>### Pad函数用法详解 #### 一、PyTorch中的F.pad 函数原型: ```python torch.nn.functional.pad(input, pad, mode='constant', value=0) ``` - `input`: 输入张量 - `pad`: 填充宽度,形式为`(左, 右, 上, 下)`或更高维度的多组值 - `mode`: 填充模式,支持`constant`、`reflect`、`replicate`等 - `value`: 仅`constant`模式有效,设置填充值 示例: ```python import torch x = torch.tensor([1, 2, 3]) y = torch.nn.functional.pad(x, (2, 3), value=4) # 左侧填充2个4,右侧填充3个4 # 输出: tensor([4, 4, 1, 2, 3, 4, 4, 4]) ``` #### 二、TensorFlow中的tf.pad 函数原型: ```python tf.pad(tensor, paddings, mode='CONSTANT', constant_values=0) ``` - `paddings`: 二维列表,每行对应维度的`(前填充, 后填充)` - `mode`: 支持`CONSTANT`、`REFLECT`、`SYMMETRIC` 示例: ```python import tensorflow as tf t = tf.constant([[1, 2], [3, 4]]) result = tf.pad(t, [[1, 2], [0, 1]], mode='CONSTANT') # 第0维上下填充,第1维右填充 # 输出: [[0 0 0] [1 2 0] [3 4 0] [0 0 0] [0 0 0]] [^2] ``` #### 三、NumPy中的np.pad 函数原型: ```python numpy.pad(array, pad_width, mode='constant', **kwargs) ``` - `pad_width`: 每个维度的`(前填充, 后填充)`元组列表 - `mode`: 支持`constant`、`edge`、`linear_ramp`、`reflect`等 - `constant_values`: 可指定不同侧填充值,如`(左值, 右值)` 示例分析: ```python import numpy as np a = np.array([1,2,3,4]) # 前填充1个0,后填充2个0 b = np.pad(a, (1,2), 'constant') # 输出: [0 1 2 3 4 0 0] [^5] # 前填充0,后填充1(右值覆盖) c = np.pad(a, (1,2), 'constant', constant_values=(0,1)) # 输出: [0 1 2 3 4 1 1] [^5] ``` #### 四、实现原理 1. **维度计算**:根据输入尺寸和填充宽度计算输出形状,例如输入$n$元素,左右填充$p_1,p_2$时,输出长度为$n+p_1+p_2$。 2. **填充逻辑**: - `constant`模式:直接填充固定值 - `reflect`模式:镜像对称边界值,如输入`[1,2,3]`前填充2个元素时,得到`[2,1,1,2,3,3,2]` - `linear_ramp`模式:边缘值线性递减,如`np.pad([1,2], (2,2), 'linear_ramp')`生成`[0, 0.5, 1, 2, 1.5, 1]`[^4] $$ \text{输出尺寸} = \sum_{i=1}^n (p_{前}^{(i)} + p_{后}^{(i)}) + \text{原尺寸} $$ 3. **性能优化**:底层实现通常使用预编译的C/C++代码或CUDA核函数加速张量操作[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Python图像识别

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

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

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

打赏作者

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

抵扣说明:

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

余额充值