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

Объединение массивов: concatenate и stack

Содержание курса

Разница между concatenate и stack: алгоритм проверки shape

Оба инструмента объединяют массивы, но делают это принципиально по-разному. np.concatenate работает с уже существующими осями: число измерений результата совпадает с числом измерений входных массивов, а один из размеров увеличивается. np.stack создаёт новую ось: результат всегда имеет на одно измерение больше, чем входные.

Это различие хорошо видно на одномерных векторах:

  • np.concatenate([a, b], axis=0) для двух векторов shape (n,) даёт shape (2n,) — один длинный вектор.
  • np.stack([a, b], axis=0) для тех же векторов даёт shape (2, n) — матрицу из двух строк.

Результаты морфологически разные, хотя данные «те же самые».

Алгоритм предсказания shape для concatenate

Чтобы узнать shape результата до запуска кода, достаточно трёх шагов:

  1. Выпишите shape каждого входного массива.
  2. Убедитесь, что по всем осям, кроме k, размеры совпадают — иначе будет ValueError.
  3. По оси k сложите соответствующие размеры всех входных массивов; по остальным осям оставьте размер как есть.

Пример: массивы (2, 3) и (2, 3) при axis=0 → складываем первые числа: 2+2=4, второе остаётся 3 → результат (4, 3).

Алгоритм предсказания shape для stack

  1. Убедитесь, что все входные массивы имеют строго одинаковую shape.
  2. Возьмите исходный кортеж shape.
  3. Вставьте число массивов n в позицию k этого кортежа.

Пример: два массива (3, 4) при axis=1 → берём (3, 4), вставляем 2 на позицию 1 → (3, 2, 4).

Этот алгоритм работает для любого числа осей и любого числа складываемых массивов. Если складываете пять массивов shape (6, 7) через np.stack(axis=0), результат — (5, 6, 7): число массивов на нулевую позицию, исходная форма следом.

Главный практический вопрос при выборе между двумя функциями: нужно ли сохранить число осей или добавить новое измерение? Если нужно просто удлинить — concatenate. Если нужно «сложить в стопку» с сохранением структуры каждого массива — stack.