Нашли ошибку?
среднийNumPy 2.5.3

Оси: T, newaxis, squeeze

Поменять оси местами, добавить ось длины 1 или убрать лишние единичные оси.

Нужно знать:reshape и ravel

Содержание статьи

Коротко

  • a.T — транспонирование: строки становятся столбцами. Для многомерного массива порядок осей переворачивается.
  • np.transpose(a, axes) задаёт порядок осей явно; moveaxis переносит одну ось, swapaxes меняет две местами.
  • a[:, np.newaxis] (или np.expand_dims) добавляет ось длины 1: вектор (3,) → столбец (3, 1).
  • np.squeeze убирает все оси длины 1: (3, 1) → (3,).
  • Всё это — представления: данные не копируются.

Синтаксис

a.T                          # перевернуть порядок осей
np.transpose(a, (0, 2, 1))   # явный порядок
np.moveaxis(a, source, destination)
np.swapaxes(a, 0, 1)
a[:, np.newaxis]             # добавить ось; np.newaxis — это None
np.expand_dims(a, axis=0)
np.squeeze(a, axis=None)     # убрать оси длины 1

Параметры

ПараметрЧто делаетПо умолчанию
axesновый порядок осей для transpose; None — обратныйNone
source, destinationоткуда и куда перенести ось в moveaxisобязательный
axisкуда вставить ось (expand_dims) или какую убрать (squeeze)— / None

Примеры

Данные для примеровиспользуются во всех примерах ниже
# оценки: 2 ученика × 3 предмета
scores = np.array([[4, 5, 3],
                   [5, 4, 4]])
Транспонирование матрицы
print(scores.T)          # 3 предмета × 2 ученика
scores.T.shape
Вывод
[[4 5]
 [5 4]
 [3 4]]
(3, 2)
Порядок осей в многомерном массиве
batch = np.zeros((10, 28, 28, 3))              # картинки × высота × ширина × каналы
print(np.transpose(batch, (0, 3, 1, 2)).shape) # каналы на второе место
print(np.moveaxis(batch, -1, 1).shape)         # то же через moveaxis
np.swapaxes(batch, 1, 2).shape
Вывод
(10, 3, 28, 28)
(10, 3, 28, 28)
(10, 28, 28, 3)
Добавить ось
v = np.array([1, 2, 3])
print(v[np.newaxis, :].shape)   # строка (1, 3)
print(v[:, np.newaxis].shape)   # столбец (3, 1)
np.expand_dims(v, axis=1).shape
Вывод
(1, 3)
(3, 1)
(3, 1)
Убрать оси длины 1
col = np.array([[7], [8], [9]])   # (3, 1)
print(np.squeeze(col))
np.zeros((1, 5, 1)).squeeze().shape
Вывод
[7 8 9]
(5,)

Подводные камни

Вектор не транспонируется

У одномерного массива одна ось, переставлять нечего: v.T — тот же вектор. Чтобы получить столбец, добавьте ось: v[:, np.newaxis] или v.reshape(-1, 1).

.T для вектора
v = np.array([1, 2, 3])
v.T.shape                          # у одномерного массива транспонирование ничего не меняет
Вывод
(3,)

squeeze(axis=…) только для осей длины 1

Убрать ось длины 2ошибка: ValueError
np.zeros((3, 2)).squeeze(axis=1)   # ось длины 2 убрать нельзя
Ошибка
ValueError: cannot select an axis to squeeze out which has size not equal to one