Нашли ошибку?
среднийNumPy 2.5.3

Дополнение: pad

Добавить значения по краям массива — нули, повтор края, зеркальное отражение.

Нужно знать:Объединение и разделение

Содержание статьи

Коротко

  • np.pad(a, pad_width, mode) возвращает новый массив с добавленными краями.
  • pad_width: число — столько же с каждой стороны каждой оси; (до, после) — для всех осей; ((до, после), …) — для каждой оси отдельно.
  • По умолчанию mode="constant": края заполняются нулями или constant_values.
  • edge повторяет крайний элемент, reflect отражает без повтора края, wrap продолжает по кругу.
  • Типичное применение — сохранить длину после свёрток и скользящих окон.

Синтаксис

np.pad(a, pad_width, mode="constant", constant_values=0)
np.pad(a, 2)                     # по 2 с каждой стороны
np.pad(a, (1, 3))                # 1 в начале, 3 в конце
np.pad(m, ((0, 1), (2, 0)))      # по осям отдельно

Параметры

ПараметрЧто делаетПо умолчанию
pad_widthсколько добавить: число, (до, после) или по паре на каждую осьобязательный
modeconstant, edge, reflect, symmetric, wrap, linear_ramp, mean, median…"constant"
constant_valuesчем заполнять в режиме constant0

Примеры

Данные для примеровиспользуются во всех примерах ниже
signal = np.array([3, 5, 4])
Нули и своё значение
print(np.pad(signal, 2))                      # по 2 нуля с каждой стороны
np.pad(signal, (1, 3), constant_values=-1)    # слева 1, справа 3
Вывод
[0 0 3 5 4 0 0]
array([-1,  3,  5,  4, -1, -1, -1])
Режимы заполнения
print(np.pad(signal, 2, mode="edge"))         # повторить край
print(np.pad(signal, 2, mode="reflect"))      # зеркально, без края
np.pad(signal, 2, mode="wrap")                # по кругу
Вывод
[3 3 3 5 4 4 4]
[4 5 3 5 4 5 3]
array([5, 4, 3, 5, 4, 3, 5])
Рамка вокруг матрицы
img = np.array([[1, 2],
                [3, 4]])
print(np.pad(img, 1))                         # рамка из нулей
np.pad(img, ((0, 1), (2, 0)))                 # снизу 1 строка, слева 2 столбца
Вывод
[[0 0 0 0]
 [0 1 2 0]
 [0 3 4 0]
 [0 0 0 0]]
array([[0, 0, 1, 2],
       [0, 0, 3, 4],
       [0, 0, 0, 0]])
Скользящее среднее той же длины
padded = np.pad(signal, 1, mode="edge")
(padded[:-2] + padded[1:-1] + padded[2:]) / 3   # среднее по 3 точкам той же длины
Вывод
array([3.66666667, 4.        , 4.33333333])

Подводные камни

Значение приводится к типу массива

constant_values записывается в массив исходного типа: дробное значение в целом массиве будет обрезано. Сначала приведите массив к float.

0.5 в целом массиве
np.pad(np.array([1, 2]), 1, constant_values=0.5)   # 0.5 в целом массиве станет 0
Вывод
array([0, 1, 2, 0])