NumPy Pad: Использование np.pad() для дополнения массивов и матриц

В этом учебном пособии вы научитесь использовать мощную функцию pad в NumPy для дополнения массивов и матриц в NumPy и Python. Этот метод часто используется в глубоком обучении, особенно при разработке сверточных нейронных сетей. Умение владеть этой функцией позволит вам создавать мощные модели глубокого обучения для классификации и обработки изображений.

Функциональность этой функции не ограничивается областью глубокого обучения. Она позволяет эффективно работать с матрицами, например, обеспечивая их согласованность по размеру для возможности трансляции. Аналогично, её можно использовать в обработке изображений для добавления к изображению границ.

К концу этого учебного пособия вы научитесь:

  • Что такое функция np.pad() и как ее использовать

  • Как заполнить одномерные и многомерные массивы

  • Как настроить заполнение значений

  • Как использовать функцию np.pad() для добавления границы к изображению

Оглавление

Понимание функции клавиатуры NumPy

Перед тем как погрузиться в использование функции np.pad(), будет полезно разобраться с базовым синтаксисом функции. Давайте рассмотрим, как выглядит функция, а затем исследуем различные параметры, которые функция предлагает:

# Understanding the np.pad() Function
np.pad(
   array, 
   pad_width, 
   mode='constant', 
   **kwargs
)

В таблице ниже представлены параметры функции np.pad():

ПараметрОписаниеОжидаемые значенияЗначения по умолчанию

array=

Массив, который будет дополнен

array-like

N/A

pad_width=

Количество значений для заполнения по каждому краю.

sequence, array-like, integer

N/A

mode=

Тип используемого заполнения

string or function

'constant'

stat_length=

Количество значений на краю каждой оси, используемое для расчета статистического значения. Используется, когда режим является одним из:'maximum', 'mean', 'median', or 'minimum'.

sequence or integer

'None'

constant_values=

Используется, когдаmode='constant'.

sequence or scalar

0

end_values=

Используется, когдаmode='linear_ramp', чтобы обеспечить конечное значение линейного изменения

sequence or scalar

0

reflect_type=

Используется, когда установлен режим 'reflect' или 'symmetric'.

'even' or 'odd'

N/A

В основном, наиболее важными параметрами являются array=, pad_width=, и mode=. Параметр mode= позволяет настроить множество различных опций. Давайте рассмотрим некоторые из аргументов, которые вы можете использовать:

  • 'constant': площадки с постоянным значением

  • 'edge': площадки с использованием краевых значений массива

  • 'linear-ramp':контактные площадки с линейным изменением между end_value и значением края массива

  • 'maximum': контактные площадки с максимальным значением всего или части вектора по каждой оси

  • 'mean': площадки со средним значением всего или части вектора вдоль каждой оси

  • 'median': площадки со средним значением всего или части вектора вдоль каждой оси

  • 'minimum': площадки с минимальным значением всего или части вектора по каждой оси

  • 'reflect': площадки с отражением вектора

  • 'symmetric': контактные площадки с отражением вектора, зеркально отраженным по краю массива

  • 'wrap': контактные площадки с переворотом вектора по оси

  • 'empty':контактные площадки с неопределенными значениями

Теперь, когда мы рассмотрели обширную документацию для функции np.pad(), давайте начнем смотреть на некоторые практические примеры.

Заполнение одномерного массива NumPy

В этом первом примере вы узнаете, как использовать функцию pad в NumPy для дополнения массива. Давайте начнем с рассмотрения одномерного массива, чтобы лучше понять, что происходит.

# Using the np.pad() Function with a Single Dimension
import numpy as np

arr = np.array([1, 2, 3])
padded = np.pad(arr, pad_width=2)
print(padded)

# Returns:
# [0 0 1 2 3 0 0]

В приведенном выше примере мы дополнили массив шириной 2. По умолчанию NumPy будет использовать значение 0. Мы можем настроить значение, изменив параметр constant_value=. Давайте используем значение 100 для дополнения нашего массива:

# Padding an Array with a Non-Default Value
import numpy as np

arr = np.array([1, 2, 3])
padded = np.pad(arr, pad_width=2, constant_values=100)
print(padded)

# Returns:
# [100 100   1   2   3 100 100]

При работе с одномерными массивами, добавление отступов может быть полезной функцией. Однако, настоящая сила этой функции раскрывается при работе с многомерными массивами, например, с изображениями. Именно это вы узнаете в следующем разделе.

Заполнение многомерного массива NumPy

В этом разделе вы узнаете, как использовать функцию np.pad() для добавления отступов к многомерному массиву. Это может быть полезно во многих ситуациях, таких как создание сверточных нейронных сетей. Давайте посмотрим, как мы можем использовать функцию для добавления отступов к многомерному массиву с использованием константных значений:

# Padding a Multi-Dimensional Array with np.pad()
import numpy as np

arr = np.arange(9).reshape(3, 3)
padded = np.pad(arr, pad_width=1)
print(padded)

# Returns:
# [[0 0 0 0 0]
#  [0 0 1 2 0]
#  [0 3 4 5 0]
#  [0 6 7 8 0]
#  [0 0 0 0 0]]

В приведенном выше примере мы создали матрицу 3×3 со значениями от 0 до 9. Затем мы применили отступ размером 1 со значениями по умолчанию равными 0.

Заполнение массива NumPy различными количествами заполнения

Использование функции np.pad() также позволяет применять разное количество отступов. Это может быть полезно, если вам нужно применить отступ, скажем, только к одной или двум сторонам. Для этого мы можем передать последовательность в параметр pad_width=. Давайте посмотрим, как это выглядит:

# Padding Arrays with Different Amounts
import numpy as np

arr = np.arange(9).reshape(3, 3)
padded = np.pad(arr, pad_width=((1, 0), (0, 1)))
print(padded)

# Returns:
# [[0 0 0 0]
#  [0 1 2 0]
#  [3 4 5 0]
#  [6 7 8 0]]

В примере выше мы видим, что функция также принимает структуру, похожую на последовательность. Передавая кортеж из кортежей ((1, 0), (0, 1)), мы указываем, что хотим получить отступ следующей структуры:

  • 1 сверху

  • 0 внизу

  • 0 слева

  • 1 справа

Применение этого метода является эффективным способом настройки методов заполнения ваших массивов.

Использование панели NumPy для заполнения ближайшими значениями

В этом разделе вы узнаете, как использовать NumPy для заполнения массива ближайшими значениями, найденными в массиве. Для этого необходимо изменить параметр mode= на значение 'edge'. Это позволяет заменить значение на значение, ближайшее к краю.

Это лучше всего демонстрируется на примере:

# Padding an Array with the Nearest Value Using np.pad()
import numpy as np

arr = np.arange(9).reshape(3, 3)
padded = np.pad(arr, pad_width=1, mode='edge')
print(padded)

# Returns:
# [[0 0 1 2 2]
#  [0 0 1 2 2]
#  [3 3 4 5 5]
#  [6 6 7 8 8]
#  [6 6 7 8 8]]

Мы видим, что значения смещаются к краю, что может быть полезно при добавлении заполнителя к тензору для сверточных нейронных сетей.

Использование клавиатуры NumPy для добавления границы к изображению

В этом разделе мы рассмотрим, как использовать функцию np.pad() для добавления рамки к изображению. Поскольку изображения можно легко представить в виде массивов значений, мы можем использовать функцию np.pad(), чтобы добавить к изображению рамку однотонного цвета.

Давайте посмотрим, как это работает. Вы можете загрузить изображение обложки и использовать его, чтобы следовать инструкциям урока, или же можете использовать своё собственное изображение.

# Using np.pad() to Add a Border to an Image
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import image

arr = image.imread('/Users/nikpi/Downloads/im.jpeg')
with_border = np.pad(arr, pad_width=((100, 100), (100, 100), (0,0)))
plt.imshow(with_border)
plt.show()

Это возвращает следующее изображение:

Зеркальное отображение изображения с помощью клавиатуры NumPy

В этом заключительном разделе вы узнаете, как отразить изображение с помощью функции np.pad(). Это может быть полезно, если вы хотите применить некоторые базовые преобразования к изображению. Это часто делается, например, при применении простых трансформаций для улучшения классификации в нейронных сетях.

Давайте рассмотрим, как это делается с использованием функции np.pad():

# Mirror an Image Using np.pad()
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import image

img = image.imread('/Users/nikpi/Downloads/im.jpeg')
height, width, _ = img.shape

plt.imshow(np.pad(img, ((0,0), (0, width), (0, 0)), mode='reflect'))
plt.show()

Это возвращает следующее изображение:

Заключение

В этом учебнике вы узнали, как использовать функцию np.pad() для добавления отступов к массиву NumPy. Это может быть полезным методом для обучения, чтобы гарантировать, что массивы имеют заданный размер, когда должны быть определены отступы. Функция предлагает огромное количество опций для настройки результатов функции.

Вы сначала научились добавлять заполнение к массиву одномерному, затем к многомерному массиву. После этого вы научились настраивать получившийся массив. В заключение, вы освоили работу с изображениями, включая возможность добавлять к ним рамку или зеркально отражать изображение.

Дополнительные ресурсы

Чтобы узнать больше о схожих темах, посмотрите следующие учебные пособия ниже:

  • NumPy linspace: создание равномерно расположенных массивов с помощью np.linspace

  • Пространство журналов NumPy: понимание функции np.logspace()

  • Плитка NumPy для упорядочения массивов

  • Различные способы объединения массивов NumPy в Python

Last updated