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

repeat и tile

Повторить каждый элемент или весь массив несколько раз.

Нужно знать:Объединение и разделение

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

Коротко

  • np.repeat(a, k) повторяет каждый элемент k раз: [1, 2] → [1, 1, 2, 2].
  • np.tile(a, k) повторяет весь массив: [1, 2] → [1, 2, 1, 2].
  • repeat принимает и список повторов — у каждого элемента своё число.
  • У repeat без axis многомерный массив сначала вытягивается в строку; tile с кортежем повторяет по нескольким осям.
  • Для арифметики с повторёнными данными обычно хватает транслирования — оно не копирует данные.

Синтаксис

np.repeat(a, repeats, axis=None)
np.tile(a, reps)          # reps — число или кортеж по осям

Параметры

ПараметрЧто делаетПо умолчанию
repeatsсколько раз повторить; число или список по одному на элементобязательный
axisось повторения в repeat; None — сначала вытянуть в строкуNone
repsсколько раз повторить массив в tile; кортеж — по каждой осиобязательный

Примеры

Данные для примеровиспользуются во всех примерах ниже
m = np.array([[1, 2],
              [3, 4]])
Каждый элемент или весь массив
week = np.array([1, 2, 3])
print(np.repeat(week, 2))       # каждый элемент по 2 раза
np.tile(week, 2)                # весь массив 2 раза
Вывод
[1 1 2 2 3 3]
array([1, 2, 3, 1, 2, 3])
Разное число повторов
np.repeat(np.array(["чай", "кофе", "сок"]), [3, 1, 2])   # у каждого своё число повторов
Вывод
array(['чай', 'чай', 'чай', 'кофе', 'сок', 'сок'], dtype='<U4')
repeat по оси
print(np.repeat(m, 2, axis=0))  # каждая строка дважды
np.repeat(m, 2)                 # без axis — массив вытягивается в строку
Вывод
[[1 2]
 [1 2]
 [3 4]
 [3 4]]
array([1, 1, 2, 2, 3, 3, 4, 4])
tile по двум осям
np.tile(m, (2, 3))              # 2 раза вниз, 3 раза вправо
Вывод
array([[1, 2, 1, 2, 1, 2],
       [3, 4, 3, 4, 3, 4],
       [1, 2, 1, 2, 1, 2],
       [3, 4, 3, 4, 3, 4]])

Подводные камни

Копирование там, где хватит транслирования

tile и repeat создают полноценные копии. Если повтор нужен только для поэлементной операции, транслирование даст тот же результат без лишней памяти.

tile против транслирования
prices = np.array([10, 20, 30])
qty = np.array([[1], [2]])
print(prices * np.tile(qty, (1, 3)))   # tile не нужен…
prices * qty                           # …транслирование делает то же без копий
Вывод
[[10 20 30]
 [20 40 60]]
array([[10, 20, 30],
       [20, 40, 60]])