Удаление размерности из массивов NumPy с помощью NumPy Squeeze

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

Кратко, функция возвращает входной массив, из которого удалены все подмассивы, длина измерения которых равна 1.

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

Оглавление

Понимание синтаксиса функции сжатия() NumPy

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

Давайте рассмотрим параметры функции:

# Понимание функции np.squeeze()
np.squeeze(
   a=,           # Массив, который необходимо уплотнить (сжать)
   axis = None   # Выбор подмножества записей (по умолчанию - все измерения)
)

Мы видим из приведенного выше блока кода, что функция принимает два параметра:

  1. Массив для сжатия, который должен быть похож на массив (например, список в Python)

  2. Ось для сжатия, которая может быть None, целым числом или кортежем целых чисел.

Теперь, когда вы знакомы с синтаксисом функции np.squeeze(), давайте рассмотрим простой пример использования этой функции.

Как использовать сжатие NumPy() в массиве NumPy

В этом разделе вы узнаете, как использовать функцию squeeze() в NumPy на примере. Мы создадим массив, у которого будут дополнительные размерности с длиной 1. Давайте сначала создадим этот массив, используя функцию np.linspace() и изменим его форму.

# Создание массива в NumPy
import numpy as np

arr = np.linspace(0, 5, 6).reshape(1,2,3) # Генерация одномерного массива из шести значений и преобразование его во трехмерный массив с размерностью (1, 2, 3)

print(arr)

# Возвращает:
# [[[0. 1. 2.]
#   [3. 4. 5.]]]

Мы можем проверить форму массива, используя атрибут .shape, как показано ниже:

# Проверка размерности нашего NumPy-массива
import numpy as np

arr = np.linspace(0, 5, 6).reshape(1,2,3) # Генерация одномерного массива из шести значений и преобразование его во трехмерный массив с размерностью (1, 2, 3)

print(arr.shape) # Проверка размерности нашего массива

# Возвращает:
# (1, 2, 3)

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

# Удаление измерения длины 1 при помощи np.squeeze()
import numpy as np

arr = np.linspace(0, 5, 6).reshape(1,2,3) # Генерация одномерного массива из шести значений и преобразование его во трехмерный массив с размерностью (1, 2, 3)

print(f'Оригинальная форма массива: {arr.shape}') # Проверка размерности нашего массива

arr = np.squeeze(arr) # Удаление измерения длины 1 из нашего массива
print(f'Форма модифицированного массива: {arr.shape}') # Проверка размерности нашего модифицированного массива

# Возвращает:
# Оригинальная форма массива: (1, 2, 3)
# Форма модифицированного массива: (2, 3)

Изначально у нас был массив с формой (1, 2, 3). Когда мы выполнили операцию squeeze для массива, это удалило изначальное измерение с длиной 1.

Как использовать сжатие NumPy() только с некоторыми осями

В приведенном выше примере мы использовали функцию squeeze() из NumPy для безразличного удаления измерений длиной 1. По умолчанию NumPy будет передавать параметр axis=None, который и будет делать именно это. Если нам не нужно такое поведение, мы можем изменить параметр axis=, чтобы удалять только некоторые измерения.

Давайте создадим более сложный массив для работы:

# Создание массива с множеством измерений длины 1
import numpy as np

arr = np.linspace(0, 5, 6).reshape(1,2,1,3) # Генерация одномерного массива из шести значений и преобразование его в четырехмерный массив с размерностью (1, 2, 1, 3)

print(arr) # Вывод нашего массива

# Возвращает:
# [[[[0. 1. 2.]]
#  
#   [[3. 4. 5.]]]]

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

Давайте посмотрим, как мы можем использовать функцию np.squeeze() для удаления третьей оси. Поскольку индексация в Python начинается с 0, нам нужно передать значение оси, равное 2.

# Удаление только определенных измерений в NumPy
import numpy as np

arr = np.linspace(0, 5, 6).reshape(1,2,1,3) # Генерация одномерного массива из шести значений и преобразование его в четырехмерный массив с размерностью (1, 2, 1, 3)

print(f'Оригинальная форма массива: {arr.shape}') # Проверка размерности нашего массива

arr = np.squeeze(arr, 2) # Удаление измерения длины 1 из третьего измерения
print(f'Форма модифицированного массива: {arr.shape}') # Проверка размерности нашего модифицированного массива

# Возвращает:
# Оригинальная форма массива: (1, 2, 1, 3)
# Форма модифицированного массива: (1, 2, 3)

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

Заключение

В этом руководстве вы научились использовать функцию NumPy squeeze() для уменьшения размерности массива. Функция удаляет оси длиной 1, которые могут мешать анализу данных. Сначала вы научились понимать синтаксис функции и ее два параметра. Затем вы узнали, как использовать функцию на примере. Наконец, вы научились использовать функцию для удаления только определенных осей.

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

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

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

  • np.argmax(): Как использовать NumPy Argmax

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

  • NumPy для науки о данных в Python

Last updated