NumPy: вычисления и устройство массивов

Объединение массивов: 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 без запуска кода. Нужно знать: сколько массивов складываете и куда вставляете новое измерение.