Коротко
np.concatenate(список, axis)склеивает по существующей оси. Размеры по остальным осям должны совпадать.np.stack(список, axis)добавляет новую ось: из двух(2, 2)получается(2, 2, 2). Формы должны совпадать полностью.- Короткие варианты:
vstack— одно под другим (векторы становятся строками),hstack— рядом,column_stack— векторы как столбцы. np.split(a, n)— наnравных частей,np.split(a, [i, j])— по индексам разреза.np.array_splitдопускает неравные части.- Функции принимают список массивов, а не несколько аргументов.
Синтаксис
np.concatenate([a, b], axis=0)
np.stack([a, b], axis=0)
np.vstack([a, b]), np.hstack([a, b]), np.column_stack([a, b])
np.split(a, 3, axis=0) # 3 равные части
np.split(a, [2, 5]) # a[:2], a[2:5], a[5:]
np.array_split(a, 3) # части могут отличаться на 1Параметры
ПараметрЧто делаетПо умолчанию
arraysсписок или кортеж массивовобязательныйaxisось склейки или разреза; в stack — место новой оси0indices_or_sectionsчисло частей или список индексов разрезаобязательныйПримеры
jan = np.array([[5, 3],
[2, 7]]) # продажи за январь: 2 магазина × 2 товара
feb = np.array([[4, 6],
[1, 8]])print(np.concatenate([jan, feb])) # по строкам (axis=0)
np.concatenate([jan, feb], axis=1) # по столбцамВывод
[[5 3]
[2 7]
[4 6]
[1 8]]
array([[5, 3, 4, 6],
[2, 7, 1, 8]])both = np.stack([jan, feb]) # новая ось: месяцы × магазины × товары
print(both.shape)
np.stack([jan, feb], axis=-1).shapeВывод
(2, 2, 2) (2, 2, 2)
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
print(np.vstack([a, b])) # векторы как строки
print(np.hstack([a, b])) # подряд
np.column_stack([a, b]) # векторы как столбцыВывод
[[1 2 3]
[4 5 6]]
[1 2 3 4 5 6]
array([[1, 4],
[2, 5],
[3, 6]])data = np.arange(9)
print(np.split(data, 3)) # на 3 равные части
np.split(data, [2, 5]) # по индексам: [:2], [2:5], [5:]Вывод
[array([0, 1, 2]), array([3, 4, 5]), array([6, 7, 8])] [array([0, 1]), array([2, 3, 4]), array([5, 6, 7, 8])]
np.array_split(np.arange(7), 3) # части могут быть неравнымиВывод
[array([0, 1, 2]), array([3, 4]), array([5, 6])]
Подводные камни
split требует равного деления
np.split(np.arange(7), 3)Ошибка
ValueError: array split does not result in an equal division
Размеры по остальным осям не совпадают
np.concatenate([jan, np.array([[1, 2, 3]])])Ошибка
ValueError: all the input array dimensions except for the concatenation axis must match exactly, but along dimension 1, the array at index 0 has size 2 and the array at index 1 has size 3
np.row_stack удалён
np.row_stack([jan, feb])Ошибка
AttributeError: module 'numpy' has no attribute 'row_stack'
Склейка в цикле
Каждый concatenate копирует все данные. Накопление массива по одному куску в цикле — квадратичная сложность. Соберите куски в список и склейте один раз.