Коротко
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.
np.pad(np.array([1, 2]), 1, constant_values=0.5) # 0.5 в целом массиве станет 0Вывод
array([0, 1, 2, 0])