Иллюстрированное руководство по изменению формы массивов NumPy
Рассказываем, как перекраивать массивы NumPy в трех измерениях. Шпаргалка в конце руководства обобщает приемы работы с методами reshape, stack и ravel.
Трудность NumPy в том, что операции над многомерными массивами бывает сложно представить. Хаус Лин подготовил шпаргалки, которые сделают преобразование массивов нагляднее. Руководство подойдёт и для знакомства с NumPy.
1. Создаем массив NumPy
Аналог range для массивов. Чтобы создать простой массив, используем функцию np.arange()
. Удобно взять небольшое составное число, например, 12.
2. Изменяем форму с помощью метода reshape()
Оси и измерения. Чтобы изменить форму массива a1
, используем метод reshape()
. Преобразуем одномерный массив из 12 чисел в двумерную таблицу размером 3×4. Первое число – количество строк, второе – столбцов. Строки соответствуют оси (англ. axis) 0, столбцы – оси 1. Ещё их называют измерениями (англ. dimensions).
Автоматическое вычисление размерности. Если нужно, чтобы NumPy сам определил размер незаданного измерения, передайте на этой позиции значение -1
:
3. Изменяем форму по разным направлениям
Порядок переноса С. По умолчанию reshape()
перестраивает исходный массив по оси 0. То есть в нашем примере отдельные числа из одномерного массива «переносятся» в двумерный построчно. Поведение можно изменить, передав значение параметру order
. Дефолтный метод похож на то, как преобразование реализовано в C. Параметр order
по умолчанию имеет значение 'C'
:
Порядок переноса Fortran. Если вы привыкли к тому, как преобразуются массивы в MATLAB, то это делается так же, как в Fortran. Поэтому используйте значение 'F'
:
Какую размерность имеет исходный массив a1
? Может показаться, что массив a1 имеет размерность (1, 12)
. Но это одномерный массив с размерностью(12, )
. Чтобы преобразовать одномерный массив к двумерному, используем метод reshape()
:
4. Схлопываем массив до одномерного
Из 2D в 1D. Метод ravel()
преобразует многомерные массивы в одномерные. Тот же параметр order
определяет, «схлопнется» ли массив построчно или столбец за столбцом:
5. Повышаем размерность, сшивая массивы друг с другом
Создадим два массива:
Чтобы соединить два одномерных масива в двумерный, используем метод np.stack()
. Параметр axis
указывает индекс оси в результирующем массиве, по которой соединяются входные. По умолчанию axis = 0
, и массивы стыкуются строка к строке:
Чтобы соединить массивы столбец к столбцу, явным образом передаем axis = 1
:
Как не повышать число измерений? Функция hstack()
соединяет массивы горизонтально без изменения размерности. Если применить ее к одномерным массивам, получится длинный одномерный массив:
6. Создаем трехмерный массив
Где применяются многомерные массивы? Массивы, живущие в трёх и более измерениях, активно используются в глубоком обучении. Например, для операций с изображениями. В работе с нейросетями преобразование многомерных массивов – обычное дело.
Для начала создадим два двумерных массива размером 3×4:
Теперь соберём из них трёхмерный массив:
Как выглядят массивы:
Чтобы извлечь плоскость массива a1
из трехмерного, нужно передать 0
по соответствующему индексу оси:
Чтобы то же самое сделать для двумерного массива a2
, на тех же позициях вместо 0
отправляем индекс 1
. Символы двоеточия указывают, что нужно взять все элементы соответствующей оси.
7. Схлопываем многомерные массивы
Метод ravel()
действует и для массивов с числом размерностей больше 2:
8. Изменяем форму многомерных массивов
Метод reshape()
также работает с массивами любой размерности. Главное условие, которое нужно соблюдать – количество элементов в массиве не должно меняться:
Заключение
Напоследок приведем изображение со всеми элементами рассказа вместе (оригинальный pdf). Напишите нам в комментариях, если что-то осталось непонятным и требует пояснений.