Коротко
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 — сначала вытянуть в строкуNonerepsсколько раз повторить массив в 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')
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])
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 создают полноценные копии. Если повтор нужен только для поэлементной операции, транслирование даст тот же результат без лишней памяти.
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]])