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

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

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

Чем stack отличается от concatenate

np.concatenate соединяет массивы вдоль существующей оси. np.stack создаёт новую ось; входные массивы должны иметь одинаковую форму. Вот результат для двух векторов длины 2:

import numpy as np
a = np.array([1, 2])
b = np.array([3, 4])
print(np.concatenate([a, b]).tolist())
print(np.stack([a, b], axis=0).tolist())
print(np.stack([a, b], axis=1).tolist())

Результат:

[1, 2, 3, 4]
[[1, 2], [3, 4]]
[[1, 3], [2, 4]]

Формы результатов: (4,), (2, 2), (2, 2). При concatenate размеры должны совпадать по всем осям, кроме оси соединения. У одномерного массива есть только ось 0: для столбцов сначала создайте вторую ось либо используйте stack.

В предыдущих уроках мы работали с отдельными массивами: считали агрегаты, обнаруживали NaN, управляли формой. Теперь встаёт другой вопрос — как склеить несколько массивов в один. Именно здесь начинается работа с np.concatenate и np.stack.

np.concatenate: объединение по существующей оси

Когда нужно склеить несколько массивов в один, первый инструмент — np.concatenate. Его сигнатура выглядит так:

np.concatenate([arr1, arr2, ...], axis=k)

Параметр axis=k указывает, вдоль какой из уже существующих осей происходит «склейка». Ключевое слово здесь — существующей: concatenate не добавляет новых измерений, он только удлиняет массив по одной из тех осей, которые уже есть.

Чтобы операция прошла без ошибки, входные массивы должны удовлетворять двум условиям:

  • одинаковое число осей (одинаковый ndim);
  • совпадающие размеры по всем осям, кроме той, вдоль которой идёт склейка.

Правило для shape результата простое. Пусть все входные массивы имеют ndim=2, и мы склеиваем по оси 0. Тогда по оси 0 берём сумму размеров всех входных массивов; по оси 1 — размер остаётся тем же, что у каждого входного (они обязаны совпадать).

В общем виде: если склеиваем по оси k, то размер результата по оси k равен сумме соответствующих размеров входных массивов, а по всем остальным осям размер совпадает с размером входных.

Конкретно: два массива shape (2, 3) при axis=0 дают (4, 3), при axis=1 дают (2, 6). Это можно проверить ещё до запуска кода — сложить нужные цифры вручную.

Нарушение условий совместимости NumPy сразу сообщит ошибкой ValueError: all the input array dimensions except for the concatenation axis must match exactly. Это сигнал: посмотри на shape всех входных массивов и найди несовпадение.

Начать заново?

Помощник начнёт новый диалог по этой задаче. Текущая переписка останется в истории до конца срока хранения.

О переписке

Можно приложить до трёх фото PNG, JPEG или WebP по 5 МБ.

Переписка и фото хранятся 90 дней после последнего принятого сообщения. Преподаватель получит доступ к диалогу, когда вы попросите его помочь.

Проверка решения остаётся отдельным действием.