Нашли ошибку?
базовыйNumPy 2.5.3

Индексация и срезы

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

Нужно знать:Создание массивов

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

Коротко

  • Индексы начинаются с 0; отрицательные считаются с конца: a[-1] — последний элемент.
  • Срез a[start:stop:step]: stop не входит, любую часть можно опустить. a[::-1] — массив задом наперёд.
  • В срез можно присвоить число (запишется во все элементы) или массив той же длины.
  • Срез — представление (view): это окно в тот же массив, а не копия. Изменение среза меняет исходный массив.
  • Индекс за границей — IndexError, а срез за границей просто становится короче.

Синтаксис

a[i]              # один элемент
a[-1]             # последний
a[start:stop]     # stop не входит
a[start:stop:step]
a[::-1]           # в обратном порядке
a[2:5] = 0        # присваивание в срез
a[2:5].copy()     # независимая копия среза

Примеры

Данные для примеровиспользуются во всех примерах ниже
# дневная выручка за неделю, пн–вс
revenue = np.array([120, 95, 130, 110, 160, 210, 180])
Один элемент
print(revenue[0])     # понедельник
print(revenue[-1])    # последний элемент — воскресенье
revenue[-2]
Вывод
120
180
np.int64(210)
Срезы
print(revenue[1:4])   # вт, ср, чт — stop не входит
print(revenue[:5])    # будни
revenue[5:]           # выходные
Вывод
[ 95 130 110]
[120  95 130 110 160]
array([210, 180])
Шаг и обратный порядок
print(revenue[::2])   # каждый второй день
revenue[::-1]         # в обратном порядке
Вывод
[120 130 160 180]
array([180, 210, 160, 110, 130,  95, 120])
Запись в срез
revenue[5:] = 0       # число записывается во все элементы среза
print(revenue)
revenue[:3] = [1, 2, 3]
revenue
Вывод
[120  95 130 110 160   0   0]
array([  1,   2,   3, 110, 160,   0,   0])

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

Срез не копирует данные

В отличие от среза списка, срез массива — окно в те же данные. Если нужна независимая часть, вызовите .copy(). Подробнее — в представлениях и копиях.

Изменение среза
weekend = revenue[5:]
weekend[:] = 0        # меняем срез…
revenue               # …и меняется исходный массив
Вывод
array([120,  95, 130, 110, 160,   0,   0])

Индекс и срез по-разному реагируют на выход за границы

За границей массиваошибка: IndexError
print(revenue[5:100])  # срез за границей — просто короче
revenue[7]
Ошибка
[210 180]
IndexError: index 7 is out of bounds for axis 0 with size 7