Объединение массивов: 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 всех входных массивов и найди несовпадение.
