Коротко
- Индексы начинаются с 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])
Индекс и срез по-разному реагируют на выход за границы
print(revenue[5:100]) # срез за границей — просто короче
revenue[7]Ошибка
[210 180] IndexError: index 7 is out of bounds for axis 0 with size 7