Нашли ошибку?
Скачать чистый
урок 4 из 5≈ 15 минупражнения: 0 из 4

Меняем форму

Те же числа — другая таблица — reshape разложит год по неделям, -1 досчитает размер сам, ravel вытянет обратно в ряд, .T повернёт таблицу.

Python запустится при первом выполнении

Форма массива — это только способ разложить числа по строкам и столбцам. Сами числа можно разложить по-другому, не меняя их и не меняя порядка. Это делает метод reshape(строки, столбцы):

[ ]Двенадцать чисел — три формы
import numpy as np

nums = np.arange(12)
print(nums)
print(nums.reshape(3, 4))
print(nums.reshape(2, 6))
Выводсохранённый · нажмите «Выполнить», чтобы получить свой
[ 0  1  2  3  4  5  6  7  8  9 10 11]
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
[[ 0  1  2  3  4  5]
 [ 6  7  8  9 10 11]]

Числа заполняют новую форму по строкам: сначала первая строка слева направо, потом вторая. Общее число элементов должно сохраниться: 12 = 3 × 4 = 2 × 6.

[ ]Упражнение 1Таблица номеров решено

Создайте массив grid — числа от 1 до 20, разложенные в таблицу из 4 строк и 5 столбцов.

grid = ...

Год по неделям

В 2025 году 365 дней — это 52 полные недели и ещё один день. Возьмём первые 364 дня и разложим их по неделям: 52 строки по 7 дней. Тогда столбец таблицы — это один день недели за весь год:

[ ]364 дня → 52 недели
tmax = np.loadtxt("data/moscow_2025.csv", delimiter=",", skiprows=1, usecols=2)
weeks = tmax[:364].reshape(52, 7)
print(weeks.shape)
print(weeks[0])            # первая неделя
print(weeks[:, 0].shape)   # все среды
Выводсохранённый · нажмите «Выполнить», чтобы получить свой
(52, 7)
[-3.2 -3.2 -3.7 -7.2 -7.2 -7.8 -8. ]
(52,)

Строка weeks[0] — первая неделя года, столбец weeks[:, 0] — все среды (год начался в среду). То, что раньше требовало среза с шагом, теперь — просто столбец.

Форма должна вмещать ровно столько элементов, сколько есть. 364 числа нельзя разложить в таблицу 5 × 7:

[ ]364 не делится на 5 × 7ошибка: ValueError
tmax[:364].reshape(5, 7)
Ошибкасохранённый · нажмите «Выполнить», чтобы получить свой
ValueError: cannot reshape array of size 364 into shape (5,7)

−1: посчитай сам

Один из размеров можно не считать, а написать -1: NumPy вычислит его из общего числа элементов. reshape(-1, 7) — «сколько получится строк по 7»:

[ ]reshape(-1, 7)
print(tmax[:364].reshape(-1, 7).shape)
print(np.arange(10).reshape(-1, 2))
Выводсохранённый · нажмите «Выполнить», чтобы получить свой
(52, 7)
[[0 1]
 [2 3]
 [4 5]
 [6 7]
 [8 9]]
[ ]Упражнение 2Недели минимальных температур решено

Загрузите минимальные температуры (столбец 1) в tmin. Возьмите первые 364 дня и разложите их по неделям в tmin_weeks — по 7 дней в строке. Число недель не считайте — пусть посчитает NumPy.

tmin = ...
tmin_weeks = ...

Вопрос

Какая форма у np.arange(24).reshape(-1, 6)?

Обратно в ряд: ravel

ravel() вытягивает таблицу обратно в одномерный массив — строка за строкой:

[ ]Таблица → ряд
table = np.arange(6).reshape(2, 3)
print(table)
print(table.ravel())
Выводсохранённый · нажмите «Выполнить», чтобы получить свой
[[0 1 2]
 [3 4 5]]
[0 1 2 3 4 5]
[ ]Упражнение 3Снова ряд решено

Превратите таблицу tmin_weeks обратно в одномерный массив flat_tmin. Проверьте себя: напечатайте flat_tmin[:7] и tmin[:7] — числа должны совпасть.

flat_tmin = ...

Повернуть таблицу: .T

Атрибут .T — транспонирование (transpose): строки становятся столбцами, столбцы — строками. У таблицы 52 × 7 после поворота форма 7 × 52: теперь строка — день недели:

[ ]Недели в столбцах
print(weeks.T.shape)
print(weeks.T[0][:5])   # первые пять сред года
Выводсохранённый · нажмите «Выполнить», чтобы получить свой
(7, 52)
[-3.2 -4.2 -2.4 -2.9 -4.1]

Не путайте .T с reshape на «перевёрнутую» форму. Форма у них получается одна, а таблицы — разные: reshape перекладывает числа подряд, строка за строкой, а .T поворачивает таблицу — первая строка становится первым столбцом:

[ ].T и reshape(3, 2) — не одно и то же
small = np.arange(6).reshape(2, 3)
print(small)
print(small.T)
print(small.reshape(3, 2))
Выводсохранённый · нажмите «Выполнить», чтобы получить свой
[[0 1 2]
 [3 4 5]]
[[0 3]
 [1 4]
 [2 5]]
[[0 1]
 [2 3]
 [4 5]]
[ ]Упражнение 4Дни недели строками решено

Сохраните в by_day таблицу tmin_weeks, повёрнутую так, чтобы каждая строка была одним днём недели (форма 7 × 52). Затем сохраните в thursdays строку четвергов — это второй день в таблице, ведь год начался в среду.

by_day = ...
thursdays = ...

Итоги

  • reshape(строки, столбцы) раскладывает те же числа по новой форме, построчно; число элементов не меняется.
  • -1 вместо одного размера — «посчитай сам».
  • ravel() вытягивает таблицу в одномерный массив.
  • .T меняет местами строки и столбцы.
  • reshape, ravel и .T по возможности дают представление (окно на те же данные), а не копию.

Подробнее в справочнике

Нашли ошибку?