На этом шаге мы рассмотрим однострочник, демонстрирующий мощь трех интересных возможностей NumPy: срезов, транслирования и типов массивов.
Наши данные представляют собой массив, содержащий различные профессии и соответствующие зарплаты. Мы воспользуемся
всеми этими тремя понятиями, чтобы каждые два года повышать зарплаты одних только исследователей данных на 10%.
Основная загвоздка в нашей задаче - как поменять конкретные значения в многострочном массиве NumPy. Нам нужно
поменять каждое второе значение для одной конкретной строки. Посмотрим на основные понятия, которые необходимы для решения этой задачи.
Доступ по индексу и срезы в NumPy аналогичны доступу по индексу и срезам в Python (см. 25 шаг): к элементам одномерного массива можно обращаться путем указания в квадратных скобках [] индекса или диапазона индексов. Например, операция доступа по индексу x[3] возвращает четвертый элемент массива NumPy x (поскольку индекс первого элемента - 0).
Можно также использовать доступ по индексу для многомерных массивов путем указания индекса для каждого измерения по отдельности либо разделенных запятыми индексов для доступа к различным измерениям. Например, операция доступа по индексу y[0, 1, 2] служит для обращения к первому элементу первой оси координат, второму элементу второй оси координат и третьему элементу третьей оси координат. Учтите, что такой синтаксис не подходит для многомерных списков Python.
Перейдем теперь к срезам в NumPy. Изучите примеры 3.6, чтобы разобраться с одномерными срезами в NumPy, и не стесняйтесь снова обратиться к 25 шагу, если у вас возникнут какие-либо проблемы с их пониманием.
import numpy as np a = np.array([55, 56, 57, 58, 59, 60, 61]) print(a) # [55 56 57 58 59 60 61] print(a[:]) # [55 56 57 58 59 60 61] print(a[2:]) # [57 58 59 60 61] print(a[1:4]) # [56 57 58] print(a[2:-2]) # [57 58 59] print(a[::2]) # [55 57 59 61] print(a[1::2]) # [56 58 60] print(a[::-1]) # [61 60 59 58 57 56 55] print(a[:1:-2]) # [61 59 57] print(a[-1:1:-2]) # [61 59 57]
Следующий этап - полностью разобраться с многомерными срезами. Доступ по индексу выполняется путем применения одномерных срезов по отдельности для каждой оси координат (разделенных запятыми), чтобы выбрать диапазоны элементов по этой оси. Не пожалейте времени, чтобы тщательно разобраться с примерами 3.7.
import numpy as np a = np.array([[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11], [12, 13, 14, 15]]) print(a[:, 2]) # Третий столбец: [2 6 10 14] print(a[1, :]) # Вторая строка: [4 5 6 7] print(a[1, ::2]) # Вторая строка, каждый второй элемент: [4 6] print(a[:, :-1]) # Все столбцы, за исключением последнего: # [[ 0 1 2] # [4 5 6] # [8 9 10] # [12 13 14]] print(a[:-2]) # Аналогично a[:-2, :] # [[0 1 2 3] # [4 5 6 7]]
Изучайте пример 3.7 до тех пор, пока не будете уверены, что хорошо понимаете принципы многомерных срезов. Двумерный срез можно производить с помощью синтаксиса a[срез1, срез2]. Для дополнительных измерений необходимо добавить через запятую дополнительные операции срезов (с помощью операторов срезов начало:конец или начало:конец:шаг). Каждый срез служит для выбора отдельной подпоследовательности элементов соответствующего измерения. Понимания этой основной идеи вполне достаточно для перехода от одномерных к многомерным срезам.
На следующем шаге мы рассмотрим транслирование.