cupy.pad#

cupy.pad(array, pad_width, mode='constant', **kwargs)[source]#

使用指定的宽度和值填充数组。

参数:
  • array (cupy.ndarray) – 要填充的数组。

  • pad_width (sequence, array_likeint) – 在每个轴的边缘填充的值的数量。((before_1, after_1), … (before_N, after_N)) 表示每个轴独特的填充宽度。((before, after),) 表示每个轴具有相同的前后填充宽度。(pad,) 或 int 是 before = after = 所有轴的填充宽度的快捷方式。不能指定 cupy.ndarray

  • mode (strfunction, 可选) –

    以下字符串值之一或用户提供的函数

    ’constant’ (默认)

    用一个常数值填充。

    ’edge’

    用数组的边缘值填充。

    ’linear_ramp’

    用 end_value 和数组边缘值之间的线性斜坡填充。

    ’maximum’

    用每个轴上向量的全部或部分的最大值填充。

    ’mean’

    用每个轴上向量的全部或部分的平均值填充。

    ’median’

    用每个轴上向量的全部或部分的中位数填充。(未实现)

    ’minimum’

    用每个轴上向量的全部或部分的最小值填充。

    ’reflect’

    用向量沿每个轴在第一个和最后一个值上镜像的反射填充。

    ’symmetric’

    用向量沿数组边缘镜像的反射填充。

    ’wrap’

    用向量沿轴的环绕填充。第一个值用于填充末尾,末尾的值用于填充开头。

    ’empty’

    用未定义的值填充。

    <function>

    填充函数,参见 Notes。

  • stat_length (sequenceint, 可选) – 在 ‘maximum’、’mean’、’median’ 和 ‘minimum’ 模式中使用。用于计算统计值的每个轴边缘的值的数量。((before_1, after_1), … (before_N, after_N)) 表示每个轴独特的统计长度。((before, after),) 表示每个轴具有相同的前后统计长度。(stat_length,) 或 int 是 before = after = 所有轴的统计长度的快捷方式。默认值为 None,表示使用整个轴。不能指定 cupy.ndarray

  • constant_values (sequencescalar, 可选) – 在 ‘constant’ 模式中使用。用于设置每个轴的填充值的值。((before_1, after_1), … (before_N, after_N)) 表示每个轴独特的填充常数。((before, after),) 表示每个轴具有相同的前后常数。(constant,) 或 constant 是 before = after = 所有轴的常数的快捷方式。默认值为 0。不能指定 cupy.ndarray

  • end_values (sequencescalar, 可选) – 在 ‘linear_ramp’ 模式中使用。用于线性斜坡的结束值并将构成填充数组边缘的值。((before_1, after_1), … (before_N, after_N)) 表示每个轴独特的结束值。((before, after),) 表示每个轴具有相同的前后结束值。(constant,) 或 constant 是 before = after = 所有轴的常数的快捷方式。默认值为 0。不能指定 cupy.ndarray

  • reflect_type ({'even', 'odd'}, 可选) – 在 ‘reflect’ 和 ‘symmetric’ 模式中使用。’even’ 样式是默认值,围绕边缘值进行不变的反射。对于 ‘odd’ 样式,数组的扩展部分是通过将反射值从边缘值的两倍中减去而创建的。

返回:

形状由 pad_width 扩展的填充数组。

返回类型:

cupy.ndarray

注意

对于秩大于 1 的数组,后面轴的一些填充是根据前面轴的填充计算得出的。使用一个秩为 2 的数组来思考这一点最容易,其中填充数组的角是通过使用第一个轴的填充值来计算的。

填充函数(如果使用)应就地修改一个秩为 1 的数组。它具有以下签名:

padding_func(vector, iaxis_pad_width, iaxis, kwargs)

其中

vector (cupy.ndarray)

一个已经用零填充的秩为 1 的数组。填充的值是 vector[:iaxis_pad_width[0]]vector[-iaxis_pad_width[1]:]

iaxis_pad_width (tuple)

一个包含两个整数的元组,iaxis_pad_width[0] 表示在 vector 开头填充的值的数量,而 iaxis_pad_width[1] 表示在 vector 末尾填充的值的数量。

iaxis (int)

当前正在计算的轴。

kwargs (dict)

函数所需的任何关键字参数。

示例

>>> a = cupy.array([1, 2, 3, 4, 5])
>>> cupy.pad(a, (2, 3), 'constant', constant_values=(4, 6))
array([4, 4, 1, ..., 6, 6, 6])
>>> cupy.pad(a, (2, 3), 'edge')
array([1, 1, 1, ..., 5, 5, 5])
>>> cupy.pad(a, (2, 3), 'linear_ramp', end_values=(5, -4))
array([ 5,  3,  1,  2,  3,  4,  5,  2, -1, -4])
>>> cupy.pad(a, (2,), 'maximum')
array([5, 5, 1, 2, 3, 4, 5, 5, 5])
>>> cupy.pad(a, (2,), 'mean')
array([3, 3, 1, 2, 3, 4, 5, 3, 3])
>>> a = cupy.array([[1, 2], [3, 4]])
>>> cupy.pad(a, ((3, 2), (2, 3)), 'minimum')
array([[1, 1, 1, 2, 1, 1, 1],
       [1, 1, 1, 2, 1, 1, 1],
       [1, 1, 1, 2, 1, 1, 1],
       [1, 1, 1, 2, 1, 1, 1],
       [3, 3, 3, 4, 3, 3, 3],
       [1, 1, 1, 2, 1, 1, 1],
       [1, 1, 1, 2, 1, 1, 1]])
>>> a = cupy.array([1, 2, 3, 4, 5])
>>> cupy.pad(a, (2, 3), 'reflect')
array([3, 2, 1, 2, 3, 4, 5, 4, 3, 2])
>>> cupy.pad(a, (2, 3), 'reflect', reflect_type='odd')
array([-1,  0,  1,  2,  3,  4,  5,  6,  7,  8])
>>> cupy.pad(a, (2, 3), 'symmetric')
array([2, 1, 1, 2, 3, 4, 5, 5, 4, 3])
>>> cupy.pad(a, (2, 3), 'symmetric', reflect_type='odd')
array([0, 1, 1, 2, 3, 4, 5, 5, 6, 7])
>>> cupy.pad(a, (2, 3), 'wrap')
array([4, 5, 1, 2, 3, 4, 5, 1, 2, 3])
>>> def pad_with(vector, pad_width, iaxis, kwargs):
...     pad_value = kwargs.get('padder', 10)
...     vector[:pad_width[0]] = pad_value
...     vector[-pad_width[1]:] = pad_value
>>> a = cupy.arange(6)
>>> a = a.reshape((2, 3))
>>> cupy.pad(a, 2, pad_with)
array([[10, 10, 10, 10, 10, 10, 10],
       [10, 10, 10, 10, 10, 10, 10],
       [10, 10,  0,  1,  2, 10, 10],
       [10, 10,  3,  4,  5, 10, 10],
       [10, 10, 10, 10, 10, 10, 10],
       [10, 10, 10, 10, 10, 10, 10]])
>>> cupy.pad(a, 2, pad_with, padder=100)
array([[100, 100, 100, 100, 100, 100, 100],
       [100, 100, 100, 100, 100, 100, 100],
       [100, 100,   0,   1,   2, 100, 100],
       [100, 100,   3,   4,   5, 100, 100],
       [100, 100, 100, 100, 100, 100, 100],
       [100, 100, 100, 100, 100, 100, 100]])