Коротко
a.reshape(3, 4)раскладывает элементы в новую форму; число элементов должно совпадать.- Одна из размерностей может быть
-1— NumPy вычислит её сам.a.reshape(-1)вытягивает массив в одну строку. - Элементы читаются и раскладываются по строкам (порядок C);
order="F"— по столбцам. reshapeиravelпо возможности возвращают представление,flatten— всегда копию.- Другой размер (с повтором данных) — функция
np.resize.
Синтаксис
a.reshape(3, 4) # или a.reshape((3, 4))
a.reshape(-1, 4) # число строк вычислится
a.reshape(-1) # одномерный
a.ravel() # одномерный, по возможности без копии
a.flatten() # одномерный, всегда копия
np.resize(a, new_size) # другой размер, данные повторяютсяПараметры
ПараметрЧто делаетПо умолчанию
shapeновая форма: числа через запятую или кортеж; одно из чисел может быть -1обязательныйorder"C" — по строкам, "F" — по столбцам"C"copyTrue — всегда копировать; False — ошибка, если без копии нельзя; None — как получитсяNoneПримеры
hours = np.arange(12) # показания за 12 часовhours.reshape(3, 4) # 3 строки по 4Вывод
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])print(hours.reshape(-1, 6).shape) # -1: вычисли сам
print(hours.reshape(2, 2, -1).shape)
hours.reshape(-1) # в одну строкуВывод
(2, 6) (2, 2, 3) array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
print(hours.reshape(3, 4)) # по строкам (C)
hours.reshape(3, 4, order="F") # по столбцам (Fortran)Вывод
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
array([[ 0, 3, 6, 9],
[ 1, 4, 7, 10],
[ 2, 5, 8, 11]])grid = hours.reshape(3, 4)
flat_view = grid.ravel() # представление, если можно
flat_copy = grid.flatten() # всегда копия
flat_view[0] = 100
print(grid[0, 0])
flat_copy[1] = 200
grid[0, 1]Вывод
100 np.int64(1)
Подводные камни
Число элементов должно совпадать
hours.reshape(5, 2) # 12 элементов не делятся на 5 × 2Ошибка
ValueError: cannot reshape array of size 12 into shape (5,2)
Если нужен другой размер с повтором данных — np.resize; с дополнением нулями — np.pad.
np.resize(np.array([1, 2, 3]), 7) # повторяет данные до нужного размераВывод
array([1, 2, 3, 1, 2, 3, 1])
Присваивание a.shape устарело
grid = np.arange(6)
grid.shape = (2, 3)Вывод
DeprecationWarning: Setting the shape on a NumPy array has been deprecated in NumPy 2.5. As an alternative, you can create a new view using np.reshape (with copy=False if needed).