Объединение массивов: concatenate и stack
Содержание курса
np.stack: создание новой оси и практика по разным позициям
np.stack решает другую задачу: он не удлиняет массив вдоль существующей оси, а создаёт новую ось и складывает массивы вдоль неё. Это единственное, но принципиальное отличие от concatenate.
Сигнатура:
np.stack([arr1, arr2, ...], axis=k)
Параметр axis=k теперь означает: на какую позицию в кортеже shape вставить новое измерение. После вставки размер по этой позиции будет равен числу сложенных массивов.
Жёсткое требование: все входные массивы должны иметь строго одинаковую shape. Не просто совпадать по одной оси — а быть идентичными по всем осям. Если хотя бы один массив отличается, NumPy выбросит ValueError.
Одномерный случай
Возьмём два вектора shape (3,):
import numpy as np
a = np.array([1, 2, 3]) # shape (3,)
b = np.array([4, 5, 6]) # shape (3,)
# Новая ось в позиции 0 — массивы становятся строками
s0 = np.stack([a, b], axis=0)
print(s0.shape) # (2, 3)
print(s0)
# [[1, 2, 3],
# [4, 5, 6]]
# Новая ось в позиции 1 — массивы становятся столбцами
s1 = np.stack([a, b], axis=1)
print(s1.shape) # (3, 2)
print(s1)
# [[1, 4],
# [2, 5],
# [3, 6]]
При axis=0 два вектора длиной 3 превращаются в матрицу (2, 3): два — это число массивов, 3 — исходная длина. При axis=1 новая ось вставляется между существующей длиной и ничем: получаем (3, 2). Можно представить это как «каждый элемент вектора теперь имеет два значения — из a и из b».
Двумерный случай
Когда входные массивы двумерные, результат np.stack будет трёхмерным — новое измерение добавляется к уже существующим двум:
A = np.ones((3, 4)) # shape (3, 4)
B = np.ones((3, 4)) * 2 # shape (3, 4)
print(np.stack([A, B], axis=0).shape) # (2, 3, 4)
print(np.stack([A, B], axis=1).shape) # (3, 2, 4)
print(np.stack([A, B], axis=2).shape) # (3, 4, 2)
Логика прямая: берёте исходный кортеж (3, 4) и вставляете 2 (число массивов) на позицию axis:
axis=0→ вставляем2перед3, 4→(2, 3, 4)axis=1→ вставляем2между3и4→(3, 2, 4)axis=2→ вставляем2после3, 4→(3, 4, 2)
Эта операция вставки — ключ к тому, как читать shape результата np.stack без запуска кода. Нужно знать: сколько массивов складываете и куда вставляете новое измерение.
