Библиотека Numpy. Использование boolean массива для доступа к ndarray

Автор: | 04.12.2018

Рассмотрим мощный инструмент для доступа к данным ndarray в библиотеке Numpy 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, графически это будет выглядеть так.

Boolean arrays in Numpy

>>> 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. Работа с данными”.
Книга: Pandas. Работа с данными

Поделиться
Share on VK
VK
Tweet about this on Twitter
Twitter
Share on Facebook
Facebook
Share on Google+
Google+

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *


Нажимая на кнопку "Отправить комментарий", я даю согласие обработку персональных данных и принимаю политику конфиденциальности.