Pandas & NumPy Academy · Урок

Булева маска и расширенная индексация

Фильтруйте массивы по булевым условиям и выбирайте произвольные элементы с помощью массивов целочисленных индексов

Урок 4 из 413 шагов

«Булева маска и расширенная индексация» — бесплатный урок Pandas & NumPy Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Pandas & NumPy Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Pandas & NumPy Academy содержит 4 уроков всего.

Булевы массивы как маски

Булева маска — это массив значений True/False. Используйте её как индекс, чтобы оставить только элементы, отмеченные значением True, — это основной инструмент фильтрации.

import numpy as np

a = np.array([5, 3, 8, 1, 9, 2, 7])
mask = a > 4
print(mask)       # [ True False  True False  True False  True]
print(a[mask])    # [5 8 9 7]

Составные булевы условия

Создавайте составные фильтры с помощью & (и), | (или) и ~ (не). Всегда заключайте каждое условие в скобки, иначе порядок выполнения операций может привести к ошибке.

import numpy as np

a = np.array([3, 7, 2, 9, 1, 6, 4, 8])

# Elements between 4 and 8 inclusive
result = a[(a >= 4) & (a <= 8)]
print(result)   # [7 6 4 8]

# Elements less than 3 or greater than 7
result2 = a[(a < 3) | (a > 7)]
print(result2)  # [2 9 1 8]

Изменение значений с помощью булевой индексации

Можно присваивать значения непосредственно булевой выборке, изменяя на месте только подходящие элементы. Это самый быстрый способ ограничить выбросы или заполнить пропущенные значения.

import numpy as np

a = np.array([5, -3, 8, -1, 2, -7])
a[a < 0] = 0    # zero out negatives in-place
print(a)        # [5 0 8 0 2 0]

# Cap values above 6
a[a > 6] = 6
print(a)        # [5 0 6 0 2 0]

Булева фильтрация двумерных массивов

Булева маска для двумерного массива всегда возвращает плоский одномерный результат. Чтобы выбрать целые строки, создайте одномерную маску по одному столбцу и выполните индексацию по оси 0.

import numpy as np

m = np.array([[1, 5], [3, 2], [8, 4], [6, 7]])
# Select rows where first column > 4
mask = m[:, 0] > 4
print(mask)     # [False False  True  True]
print(m[mask])  # [[8 4] [6 7]]

np.where с масками

np.where(condition, x, y) сохраняет форму массива: выбирает x там, где выполняется условие, и y в остальных случаях. Идеально подходит для замены значений без выравнивания в один измерение.

import numpy as np

a = np.array([3, -1, 5, -2, 4])
result = np.where(a >= 0, a, 0)  # keep positives, replace negatives
print(result)  # [3 0 5 0 4]

# Recode: above-average -> 'high', else -> 'low'
labels = np.where(a >= a.mean(), 'high', 'low')
print(labels)  # ['high' 'low' 'high' 'low' 'high']

Основы расширенной индексации

Расширенная индексация означает передачу массива целочисленных индексов для получения определённых элементов — в любом порядке и с повторами. Она всегда возвращает копию.

import numpy as np

a = np.array([10, 20, 30, 40, 50])
idx = np.array([4, 1, 1, 3])
print(a[idx])   # [50 20 20 40]

# 2D index shape -> 2D output
idx2d = np.array([[0, 2], [4, 1]])
print(a[idx2d])  # [[10 30] [50 20]]

Расширенная индексация двумерных массивов

В двумерном массиве парные массивы индексов выбирают отдельные точки: m[rows, cols] получает элемент для каждой пары (строка, столбец), а не целую подматрицу.

import numpy as np

m = np.array([[1,  2,  3],
              [4,  5,  6],
              [7,  8,  9]])

# Select elements at (0,2), (1,0), (2,1)
rows = [0, 1, 2]
cols = [2, 0, 1]
print(m[rows, cols])  # [3 4 8]

np.ix_ для выбора сетки строк и столбцов

np.ix_ выбирает подматрицу для каждой комбинации указанных строк и столбцов — это удобно, когда нужно выбрать много строк И много столбцов, а не отдельные пары.

import numpy as np

m = np.arange(16).reshape(4, 4)
print(m)

# Select rows 0,2 and columns 1,3
ix = np.ix_([0, 2], [1, 3])
print(m[ix])
# [[ 1  3]
#  [ 9 11]]

np.nonzero() и np.argwhere()

np.nonzero возвращает индексы ненулевых (или имеющих значение True) элементов в виде кортежа для каждой оси. np.argwhere выдаёт ту же информацию в виде расположенных друг под другом удобных для чтения строк.

import numpy as np

a = np.array([0, 3, 0, 5, 0, 7])
print(np.nonzero(a))       # (array([1, 3, 5]),)
print(np.argwhere(a > 0))  # [[1] [3] [5]]

Сочетание булевой и расширенной индексации

Сочетайте оба подхода: используйте булеву маску для фильтрации строк, а затем расширенную индексацию для изменения порядка столбцов. Вместе они позволяют одним понятным шагом отфильтровать и перестроить данные.

import numpy as np

data = np.array([[1, 2, 3],
                 [4, 5, 6],
                 [7, 8, 9]])
scores = np.array([0.9, 0.3, 0.8])

# Keep high-scoring rows, reorder columns to [2, 0, 1]
high = data[scores > 0.5]
reordered = high[:, [2, 0, 1]]
print(reordered)

Производительность: булева и расширенная индексация

И булева, и расширенная индексация возвращают копии. Для фильтрации булева маска обычно наиболее понятна и достаточно быстра — это отличный вариант по умолчанию.

import numpy as np

a = np.random.rand(1_000_000)

# Boolean mask -- readable and fast
result = a[a > 0.5]
print('filtered size:', result.size)  # ~500000

# Equivalent with np.where + fancy index
idx = np.where(a > 0.5)[0]
result2 = a[idx]
print('same result:', np.array_equal(result, result2))

Быстрая проверка

Проверьте, насколько Вы поняли булеву фильтрацию и расширенную индексацию из этого урока.

Повторение урока

Отличная работа! Булевы маски фильтруют и копируют, np.where сохраняет форму массива, а расширенная индексация получает любые указанные Вами элементы. Далее: Series в Pandas!

Можно начать бесплатно

Изучай Python с ИИ-репетитором — бесплатно

Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.

Курсы
30
Уроки
120

Часто задаваемые вопросы

Урок «Булева маска и расширенная индексация» бесплатный?

Да — полный текст урока «Булева маска и расширенная индексация» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Pandas & NumPy Academy, подпишись на CoddyKit PRO. Курс Pandas & NumPy Academy содержит 4 уроков всего.

Чему я научусь в уроке «Булева маска и расширенная индексация»?

Фильтруйте массивы по булевым условиям и выбирайте произвольные элементы с помощью массивов целочисленных индексов Ты практикуешь Pandas & NumPy Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Pandas & NumPy Academy?

Предыдущий опыт не требуется. Pandas & NumPy Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «Булева маска и расширенная индексация»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Pandas & NumPy Academy?

Да. Каждый урок Pandas & NumPy Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Универсальные функции (ufuncs)
  2. Агрегирующие функции
  3. Правила broadcasting
  4. Булева маска и расширенная индексация
← Назад к Pandas & NumPy Academy