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

reshape и ravel

Разложить те же данные в другую форму — например, 12 значений в таблицу 3 × 4 — или вытянуть таблицу в одну строку.

Нужно знать:Атрибуты массиваПредставления и копии

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

Коротко

  • 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 часов
12 значений в таблицу 3 × 4
hours.reshape(3, 4)     # 3 строки по 4
Вывод
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
-1 вместо одной размерности
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]])
ravel и flatten
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)

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

Число элементов должно совпадать

Неподходящая формаошибка: ValueError
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.resize(np.array([1, 2, 3]), 7)       # повторяет данные до нужного размера
Вывод
array([1, 2, 3, 1, 2, 3, 1])

Присваивание a.shape устарело

Присваивание shapeустаревший API
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).