Рассмотрим мощный инструмент для доступа к данным ndarray в библиотеке Numpy – boolean массивы. С их помощью можно получать подвыборки и модифицировать данные в исходном массиве.
- Создание boolean массивов
- Использование boolean массивов для получения выборок
- Индексация с использованием boolean выражения
- Модификация элементов ndarray с использованием boolean массивов
Создание boolean массивов
В одном из предыдущих уроков (Библиотека Numpy. Работа с массивами. Слайсы) мы рассматривали различные способы получения элементов из ndarray. Но на этом варианты не заканчиваются. Использование boolean массивов для доступа к данным порой является более лучшим вариантом, чем использование численных индексов.
Для начала создадим несколько массивов, с которыми мы будем работать.
>>> nums = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) >>> letters = np.array(['a', 'b', 'c', 'd', 'a', 'e', 'b'])
Как вы знаете, в Python есть такой тип данных – boolean. Переменные этого типа принимают одно из двух значений: True или False. Такие переменные можно создать самостоятельно:
>>> a = True
либо они могут являться результатом какого-то выражения:
>>> b = 5 > 7 >>> print(b) False
Используя второй подход, можно построить на базе созданных нами в самом начале ndarray массивов массивы с элементами типа boolean.
>>> less_then_5 = nums < 5 >>> less_then_5 array([ True, True, True, True, False, False, False, False, False, False])
В этом примере мы создали boolean массив, в котором на месте элементов из nums, которые меньше пяти стоит True, в остальных случаях – False. Построим массив, в котором значение True будут иметь элементы, чей индекс совпадает с индексами, на которых стоит символ ‘a’ в массиве letters.
>>> pos_a = letters == 'a' >>> pos_a array([ True, False, False, False, True, False, False])
Далее мы изучим, каким образом можно использовать такого типа массивы на практике.
Использование boolean массивов для получения выборок
Самым замечательным в использовании boolean массивов при работе с ndarray является то, что их можно применять для построения выборок. Вернемся к рассмотренным выше примерам.
>>> less_then_5 = nums < 5 >>> less_then_5 array([ True, True, True, True, False, False, False, False, False, False])
Если мы переменную less_then_5 передадим в качестве списка индексов для nums, то получим массив, в котором будут содержаться элементы из nums с индексами равными индексам True позиций массива less_then_5, графически это будет выглядеть так.
>>> nums[less_then_5] array([1, 2, 3, 4])
Данный подход будет работать с массивами большей размерности. Возьмем уже знакомую нам по предыдущим урокам матрицу.
>>> m = np.matrix('1 2 3 4; 5 6 7 8; 9 1 5 7') >>> print(m) [[1 2 3 4] [5 6 7 8] [9 1 5 7]]
Построим логическую матрицу со следующим условием: m>=3 and m<=7, в Numpy нельзя напрямую записать такое условие, поэтому воспользуемся функцией logical_and(), ее и многие другие полезные функции вы сможете найти на странице Logic functions.
>>> mod_m = np.logical_and(m>=3, m<=7) >>> mod_m matrix([[False, False, True, True], [ True, True, True, False], [False, False, True, True]]) >>> m[mod_m] matrix([[3, 4, 5, 6, 7, 5, 7]])
В результате мы получили матрицу с одной строкой, элементами которой являются все отмеченные как True элементы из исходной матрицы.
Индексация с использованием boolean выражения
Boolean выражение в Numpy можно использовать для индексации, не создавая предварительно boolean массив. Получить соответствующую выборку можно, передав в качестве индекса для объекта ndarray, условное выражение. Для иллюстрации данной возможности воспользуемся массивом nums.
>>> nums = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) >>> nums[nums < 5] array([1, 2, 3, 4])
Модификация элементов ndarray с использованием boolean массивов
Еще одно возможное применение boolean массивов в Numpy – это модификация данных. В этом случае будет удобен подход индексации с использованием boolean выражения. Присвоим всем элементам из массива nums меньшим 5 значение 10, сделать это можно так.
>>> nums[nums < 5] = 10 >>> print(nums) [10 10 10 10 5 6 7 8 9 10]
Как вы можете видеть, элементы 1, 2, 3 и 4 были заменены на 10. Данных подход работает и с двумерными массивами. Покажем это на матрице m.
>>> m[m > 7] = 25 >>> print(m) [[ 1 2 3 4] [ 5 6 7 25] [25 1 5 7]]
P.S.
Если вам интересна тема анализа данных, то мы рекомендуем ознакомиться с библиотекой Pandas. На нашем сайте вы можете найти вводные уроки по этой теме. Все уроки по библиотеке Pandas собраны в книге “Pandas. Работа с данными”.
<<< Библиотека Numpy. Полезные инструменты — Библиотека Numpy. Расчет статистик по данным в массиве>>>