Нарезки (Slicing) в Python списках и Numpy
Нарезка - это расширение синтаксиса индексации с использованием квадратных скобок. Она широко используется для доступа к диапазонам (интервалам) элементов. Простой пример, есть одномерный список:
Нужно выделить из него список со средними элементами. Это можно сделать так:
2 7
[2, 3, 4, 5, 6]
Синтаксис для создания нарезки:
[начало:конец:шаг]
Если шаг равен единице, то можно использовать только начало и конец, как в предыдущем примере. Указав шаг равный 2, можно получить список из кратных 2-ке элементов:
>>> a[0:10:2]
[0, 2, 4, 6, 8]
При этом можно не указывать начало и конец, тогда они по умолчанию примут размер начала и конца списка:
>>> a[::2]
[0, 2, 4, 6, 8]
Размер шага можно указывать равным -1, тогда получим копию оригинального списка в обратном порядке:
>>> a[::-1]
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
Нарезку можно использовать и для удаления всех элементов списка, вызвав del a[:], но нагляднее все-таки использовать метод clear().
Аналогичный подход работает и для многомерных списков. Рассмотрим на примере массивов Numpy. Создадим пустой двухмерный массив Numpy (считай изображение):
С помощью нарезки создадим прямоугольник:
Из этого изображения с помощью нарезки мы можем создать более мелкое изображение:
Снова очистим изображение и нарисуем на нем решетку:
Посмотрим, а можно ли такую же вещи провернуть с контурами. Для этого подключим OpenCV и создадим изображение Uint8.
На изображении контур. Он всего один, поэтому выберем его и посмотрим содержимое:
Здесь видны 4 точки контура. Оставим только три с помощью нарезки:
array([[[100, 50]], [[100, 149]], [[149, 149]]], dtype=int32)
Ну и снова выведем на экран:
Как видим, все работает и на контурах.
Выводы:
- Нарезки очень удобны способ манипулирования с данными, который применяется в списках и массивах различного типа;
- небольшой недостаток - для части разработчиков Python это может привести к затруднению понимания кода и соответственно более сложную поддержку.