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

Индексы и срезы

Достать из массива один элемент или кусок — январь из года, последнюю неделю, каждый седьмой день — и заменить значения.

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

Индексы и срезы у одномерного массива работают так же, как у списка Python: a[i] — элемент, a[-1] — последний, a[начало:конец:шаг] — кусок. Потренируемся на максимальных температурах Москвы за год:

[ ]Температуры за год
import numpy as np

tmax = np.loadtxt("data/moscow_2025.csv", delimiter=",", skiprows=1, usecols=2)
print(tmax.shape)
Выводсохранённый · нажмите «Выполнить», чтобы получить свой
(365,)

Один элемент

Индексы считаются с нуля: 1 января — tmax[0], 31 декабря — tmax[364] или, проще, tmax[-1]:

[ ]Первый и последний день
print(tmax[0], tmax[-1])
print(tmax[364])
Выводсохранённый · нажмите «Выполнить», чтобы получить свой
-3.2 -2.0
-2.0

Элемент за пределами массива вызывает ошибку — в году 365 дней, и последний индекс 364:

[ ]Индекс за краемошибка: IndexError
tmax[365]
Ошибкасохранённый · нажмите «Выполнить», чтобы получить свой
IndexError: index 365 is out of bounds for axis 0 with size 365

Срезы

Срез tmax[начало:конец] возвращает массив из элементов с индексами от начало до конец − 1 — конец не входит, как у range и arange. Любую границу можно опустить: [:31] — с начала, [-7:] — до конца.

[ ]Январь и последняя неделя
print(tmax[:5])     # первые пять дней
print(tmax[-7:])    # последняя неделя
print(len(tmax[:31]))
Выводсохранённый · нажмите «Выполнить», чтобы получить свой
[-3.2 -3.2 -3.7 -7.2 -7.2]
[-1.4 -3.3 -4.3 -6.  -6.4 -4.8 -2. ]
31
[ ]Упражнение 1Средний январь решено

Сохраните в jan максимальные температуры января (первые 31 день года), а в jan_avg — среднюю температуру января.

jan = ...
jan_avg = ...

[ ]Упражнение 2Последние десять дней решено

Сохраните в last10 максимальные температуры последних десяти дней года.

last10 = ...

Шаг среза

Третье число в срезе — шаг: [::7] — каждый седьмой элемент, начиная с первого. Так можно взять один день недели за весь год. 2025 год начался в среду, значит, среды — это индексы 0, 7, 14…:

[ ]Все среды года
wednesdays = tmax[::7]
print(len(wednesdays))
print(wednesdays[:5])
Выводсохранённый · нажмите «Выполнить», чтобы получить свой
53
[-3.2 -4.2 -2.4 -2.9 -4.1]

Отрицательный шаг идёт с конца: [::-1] — массив задом наперёд.

[ ]Упражнение 3Все понедельники решено

Первый понедельник 2025 года — 6 января, это индекс 5. Сохраните в mondays максимальные температуры всех понедельников года, а в monday_avg — их среднее.

mondays = ...
monday_avg = ...

Вопрос

Что получится: np.arange(10)[2:8:3]?

Замена значений

В элемент и в срез можно присвоить новое значение — массив изменится на месте. Одно число в срез присваивается всем его элементам:

[ ]Исправить показания
hours = np.array([5.0, 7.5, 8.0, 99.0, 7.0])
hours[3] = 8.5       # одно значение
print(hours)
hours[:2] = 6.0      # сразу несколько
print(hours)
Выводсохранённый · нажмите «Выполнить», чтобы получить свой
[5.  7.5 8.  8.5 7. ]
[6.  6.  8.  8.5 7. ]
[ ]Упражнение 4Сбой датчика решено

В readings — показания датчика за 8 часов. Четвёртое показание (индекс 3) записано с ошибкой — исправьте его на 21.5. А два последних часа датчик был выключен: запишите в них 0.

readings = np.array([20.1, 20.4, 20.9, 99.9, 21.8, 22.0, 21.7, 21.4])

Итоги

  • a[i] — элемент, индексы с нуля; a[-1] — последний; за краем — IndexError.
  • a[начало:конец:шаг] — срез; конец не входит; границы можно опускать; [::-1] — задом наперёд.
  • Присваивание в элемент или срез меняет массив на месте.

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

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