原文:
www.kdnuggets.com/how-to-apply-padding-to-arrays-with-numpy
图片来自 freepik
填充是向数组的边缘添加额外元素的过程。这可能听起来很简单,但它有多种应用,可以显著提升数据处理任务的功能和性能。
1. Google 网络安全证书 - 快速进入网络安全职业。
2. Google 数据分析专业证书 - 提升你的数据分析水平
3. Google IT 支持专业证书 - 支持你的组织 IT
假设你正在处理图像数据。通常,在应用滤镜或执行卷积操作时,图像的边缘可能会成为问题,因为周围没有足够的像素来一致地应用操作。对图像进行填充(在原始图像周围添加行和列的像素)可以确保每个像素都得到均等处理,从而产生更准确、更具视觉吸引力的输出。
你可能会想知道填充是否仅限于图像处理。答案是否定的。在深度学习中,填充在处理卷积神经网络(CNN)时至关重要。它允许你在网络的连续层中保持数据的空间维度,防止数据在每次操作后缩小。这在保留输入数据的原始特征和结构时尤为重要。
在时间序列分析中,填充可以帮助对齐不同长度的序列。这种对齐对于将数据输入到机器学习模型中至关重要,因为输入大小的一致性通常是必要的。
在本文中,你将学习如何使用 NumPy 对数组进行填充,以及填充的不同类型和使用 NumPy 填充数组时的最佳实践。
numpy.pad 函数是 NumPy 中添加数组填充的首选工具。该函数的语法如下所示:
numpy.pad(array, pad_width, mode='constant', **kwargs)
其中:
-
array:要添加填充的输入数组。
-
pad_width:这是填充到每个轴边缘的值的数量。它指定了在数组的每个轴的两端添加的元素数量。它可以是一个整数(所有轴相同填充),一个包含两个整数的元组(每个轴的两端填充不同),或者是不同轴的这种元组的序列。
-
mode:这是用于填充的方法,决定了应用哪种类型的填充。常见的模式包括:零填充、边缘填充、对称填充等。
-
kwargs:这些是根据模式的不同而额外的关键字参数。
让我们检查一个数组示例,看看如何使用 NumPy 为其添加填充。为了简单起见,我们将专注于一种填充类型:零填充,它是最常见且直接的。
首先,让我们创建一个简单的 2D 数组来进行操作:
import numpy as np
# Create a 2D array
array = np.array([[1, 2], [3, 4]])
print("Original Array:")
print(array)
输出:
Original Array:
[[1 2]
[3 4]]
接下来,我们将为该数组添加零填充。我们使用 np.pad
函数来实现这一点。我们将指定填充宽度为 1,围绕整个数组添加一行/列的零。
# Add zero padding
padded_array = np.pad(array, pad_width=1, mode='constant', constant_values=0)
print("Padded Array with Zero Padding:")
print(padded_array)
输出:
Padded Array with Zero Padding:
[[0 0 0 0]
[0 1 2 0]
[0 3 4 0]
[0 0 0 0]]
说明
-
原始数组:我们的起始数组是一个简单的 2x2 数组,值为 [[1, 2], [3, 4]]。
-
零填充:通过使用
np.pad
,我们在原始数组周围添加了一层零。pad_width=1
参数指定在每一侧添加一行/列的填充。mode='constant'
参数表示填充应为常数值,我们通过constant_values=0
将其设置为零。
不同类型的填充方式中,零填充(zero padding),如上例所示,是其中之一;其他示例包括常数填充(constant padding)、边缘填充(edge padding)、反射填充(reflect padding)和对称填充(symmetric padding)。让我们详细讨论这些填充类型,并了解如何使用它们。
零填充是添加额外值到数组边缘的最简单和最常用的方法。这种技术涉及用零填充数组,在各种应用中非常有用,例如图像处理。
零填充涉及在数组的边缘添加填充零的行和列。这有助于在执行可能会缩小数组的操作时保持数据的大小。
示例:
import numpy as np
array = np.array([[1, 2], [3, 4]])
padded_array = np.pad(array, pad_width=1, mode='constant', constant_values=0)
print(padded_array)
输出:
[[0 0 0 0]
[0 1 2 0]
[0 3 4 0]
[0 0 0 0]]
常数填充允许你使用自己选择的常数值来填充数组,而不仅仅是零。这个值可以是你选择的任何东西,比如 0、1 或其他数字。当你希望保持特定的边界条件或零填充可能不适合你的分析时,它特别有用。
示例:
array = np.array([[1, 2], [3, 4]])
padded_array = np.pad(array, pad_width=1, mode='constant', constant_values=5)
print(padded_array)
输出:
[[5 5 5 5]
[5 1 2 5]
[5 3 4 5]
[5 5 5 5]]
边缘填充用边缘的值填充数组。不是添加零或某个常数值,而是使用最近的边缘值来填补空白。这种方法有助于保持原始数据模式,并且在你希望避免将新的或任意值引入数据时非常有用。
示例:
array = np.array([[1, 2], [3, 4]])
padded_array = np.pad(array, pad_width=1, mode='edge')
print(padded_array)
输出:
[[1 1 2 2]
[1 1 2 2]
[3 3 4 4]
[3 3 4 4]]
反射填充是一种通过从原始数组的边缘镜像值来填充数组的技术。这意味着边界值在边缘处反射,这有助于在数据中保持模式和连续性,而不会引入任何新的或任意的值。
示例:
array = np.array([[1, 2], [3, 4]])
padded_array = np.pad(array, pad_width=1, mode='reflect')
print(padded_array)
输出:
[[4 3 4 3]
[2 1 2 1]
[4 3 4 3]
[2 1 2 1]]
对称填充是一种操作数组的技术,有助于保持原始数据的平衡和自然延展。它类似于反射填充,但在反射中包括了边缘值本身。这种方法有助于在填充数组中保持对称性。
示例:
array = np.array([[1, 2], [3, 4]])
padded_array = np.pad(array, pad_width=1, mode='symmetric')
print(padded_array)
输出:
[[1 1 2 2]
[1 1 2 2]
[3 3 4 4]
[3 3 4 4]]
-
选择正确的填充类型
-
确保填充值与数据的性质一致。例如,二进制数据应使用零填充,但在图像处理任务中,边缘填充或反射填充可能更为适合,应避免使用零填充。
-
考虑填充如何影响数据分析或处理任务。填充可能会引入伪影,特别是在图像或信号处理领域,因此请选择一种能够最小化这种影响的填充类型。
-
填充多维数组时,确保正确指定填充维度。不对齐的维度可能会导致错误或意外结果。
-
清楚地记录为何以及如何在代码中应用填充。这有助于保持清晰性,并确保其他用户(或未来的你)理解填充的目的和方法。
在这篇文章中,你学习了填充数组的概念,这是一种广泛应用于图像处理和时间序列分析等领域的基本技术。我们探讨了填充如何帮助扩展数组的大小,使其适用于不同的计算任务。
我们介绍了 numpy.pad
函数,该函数简化了在 NumPy 中向数组添加填充的过程。通过清晰简明的示例,我们展示了如何使用 numpy.pad
向数组添加填充,并展示了各种填充类型,如零填充、常数填充、边缘填充、反射填充和对称填充。
遵循这些最佳实践,你可以使用 NumPy 对数组进行填充,确保你的数据操作准确、高效,并适合你的特定应用。
Shittu Olumide 是一位软件工程师和技术作家,他热衷于利用前沿技术创作引人入胜的叙述,注重细节,并擅长简化复杂概念。你还可以在 Twitter 上找到 Shittu。