Булева маска и расширенная индексация
Фильтруйте массивы по булевым условиям и выбирайте произвольные элементы с помощью массивов целочисленных индексов
«Булева маска и расширенная индексация» — бесплатный урок 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 — локальная установка не требуется.
Все уроки этого курса
- Универсальные функции (ufuncs)
- Агрегирующие функции
- Правила broadcasting
- Булева маска и расширенная индексация