Как транспонировать 1D массив в Python с использованием NumPy
Быстрый ответ
Для преобразования одномерного массива в двумерный столбцовый массив можно воспользоваться функцией np.reshape
с аргументом -1
:
array_2d = array_1d.reshape(-1, 1)
Здесь -1
говорит NumPy о том, что необходмо подобрать необходимое количество строк, чтобы сформировать столбцовый вектор.
Особенности транспонирования и размерности
Транспонирование одномерного массива в NumPy часто вызывает вопросы. Применение .T
к нему не меняет его форму – результатом остаётся тот же одномерный массив. Всё дело в том, что транспонирование применимо только для массивов, размерность которых равна двум или более.
Добавление новой размерности с помощью np.newaxis
В этом случае на помощь приходит np.newaxis
– инструмент для добавления новой оси в массив. Можно сравнить это с добавлением новой грани к объекту:
Преобразование массива в столбцовый вектор можно осуществить так:
column_vector = array_1d[:, np.newaxis]
Преобразование массива в строковый вектор выглядит следующим образом:
row_vector = array_1d[np.newaxis, :]
Трансляция или Broadcasting: работа с невидимостью
Broadcasting, или трансляция, это возможность NumPy обрабатывать массивы разной формы путём их "виртуального" расширения до совместимых размеров. Это мощный механизм, но при его использовании необходимо быть внимательным к размерам обрабатываемых массивов.
np.matrix: устаревающий метод
Ещё одним способом транспонирования одномерного массива является np.matrix
. Однако его использование не рекомендуется, поскольку этот тип устарел и его функциональность ограничена по сравнению с np.array
:
matrix = np.matrix(array_1d)
transposed_matrix = matrix.T
Визуализация
Представим одномерный массив как ряд танцующих фигурок:
До транспонирования: ☺️-💃-🏽-🚶-🏽-💃-🏽- (Идут в линии)
Теперь они становятся в столбик:
После транспонирования:
☺️
|
💃
|
🏽
|
🚶
|
🏽
|
💃
|
🏽
(Образовался вертикальный ряд!)
Для того чтобы превратить "горизонтальный ряд" в "вертикальный", используем:
import numpy as np
conga_line = np.array([1, 2, 3])
vertical_line = conga_line.reshape(-1, 1)
Расширение инструментария
Помимо .reshape
и np.newaxis
, существуют и другие методы для работы с одномерными массивами.
Гарантированное преобразование в 2D с помощью np.atleast_2d
np.atleast_2d()
гарантирует, что вы получите результат в виде двумерного массива:
two_d_array = np.atleast_2d(array_1d)
Это не транспонирование, но метод переводит массив в двумерное пространство.
Мифы о np.transpose
Применение np.transpose()
не приводит к изменению формы одномерного массива – результат будет таким же, как при использовании метода .T
.
Проверка на вменяемость с использованием .shape
Всегда можно дополнительно проверить размерность массива с помощью атрибута shape
:
print(array_1d.shape) # (n,)
print(transposed_array.shape) # (n, 1)
Подход старой школы: Использование двойных скобок [[]]
Можно также преобразовать одномерный массив в двумерный вручную:
two_d_array = np.array([[x] for x in array_1d])
Результат будет аналогичен использованию .reshape(-1, 1)
или np.newaxis
.
Полезные материалы
- numpy.reshape — Руководство NumPy v1.26 — документация по методу изменения формы массивов.
- Stack Overflow — Транспонирование одномерного массива NumPy — обсуждение проблемы транспонирования на Stack Overflow.
- Быстрый старт с NumPy — руководство для начинающих, показывающее, как работать с массивами NumPy.
- numpy.transpose — Руководство NumPy v1.26 — детальная информация о функции transpose.
- Broadcasting — Руководство NumPy v1.26 — основы работы и с примерами использования broadcasting в NumPy.
- Лекционные материалы Scipy — информация о манипуляциях с формами массивов в NumPy.