Нашли ошибку?
среднийNumPy 2.5.3

Объединение и разделение

Склеить несколько массивов в один по существующей или новой оси и разрезать массив на части.

Нужно знать:Оси: axis и keepdimsreshape и ravel

Содержание статьи

Коротко

  • 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 — место новой оси0
indices_or_sectionsчисло частей или список индексов разрезаобязательный

Примеры

Данные для примеровиспользуются во всех примерах ниже
jan = np.array([[5, 3],
                [2, 7]])       # продажи за январь: 2 магазина × 2 товара
feb = np.array([[4, 6],
                [1, 8]])
concatenate по строкам и столбцам
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]])
stack — новая ось
both = np.stack([jan, feb])                 # новая ось: месяцы × магазины × товары
print(both.shape)
np.stack([jan, feb], axis=-1).shape
Вывод
(2, 2, 2)
(2, 2, 2)
vstack, hstack, column_stack для векторов
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 требует равного деления

7 элементов на 3 частиошибка: ValueError
np.split(np.arange(7), 3)
Ошибка
ValueError: array split does not result in an equal division

Размеры по остальным осям не совпадают

Разное число столбцовошибка: ValueError
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ошибка: AttributeError
np.row_stack([jan, feb])
Ошибка
AttributeError: module 'numpy' has no attribute 'row_stack'

Склейка в цикле

Каждый concatenate копирует все данные. Накопление массива по одному куску в цикле — квадратичная сложность. Соберите куски в список и склейте один раз.