Коротко
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 — обратныйNonesource, 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)
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).
v = np.array([1, 2, 3])
v.T.shape # у одномерного массива транспонирование ничего не меняетВывод
(3,)
squeeze(axis=…) только для осей длины 1
np.zeros((3, 2)).squeeze(axis=1) # ось длины 2 убрать нельзяОшибка
ValueError: cannot select an axis to squeeze out which has size not equal to one