Булева маска NumPy: фильтрация, несколько условий и замена
Булева маска NumPy выбирает элементы, для которых условие равно True. Если маска имеет ту же форму, что и двумерный массив, a[mask] возвращает выбранные значения в одномерном массиве.
Несколько условий и скобки
Для поэлементных условий используйте & и |, а не Python-операторы and и or. Каждое сравнение заключайте в скобки: (a < 3) | (a > 7). Инверсия ~mask меняет True на False и наоборот.
Форма маски и результат отбора — разные вещи: двумерная маска полного размера отбирает отдельные элементы и не сохраняет прямоугольную структуру. Присваивание a[mask] = value заменяет выбранные элементы исходного массива.
Пример на других данных
import numpy as np
a = np.arange(8).reshape(2, 4)
mask = (a < 2) | (a > 5)
print(a[mask].tolist(), a[mask].shape)
a[~mask] = -1
print(a.tolist())
Результат:
[0, 1, 6, 7] (4,)
[[0, 1, -1, -1], [-1, -1, 6, 7]]
Попробуйте сами
Ниже — отдельное упражнение: напишите код и запустите проверку. Другие упражнения по этой теме. Для обучения по порядку откройте бесплатный курс NumPy и pandas.
Двумерный массив: маска через |, инверсия и присваивание строкой
Что уже дано
Проверяющая система запускает вашу программу и подаёт данные через stdin. Никаких заранее созданных переменных нет — вы читаете всё сами.
Что нужно сделать
Напишите программу, которая:
- Читает из
stdinдва целых числаRиC— размер двумерного массива. - Создаёт массив
mчерезnp.arange(R * C).reshape(R, C)сdtype=int. - Строит маску
mask_edgeдля элементов, которые меньшеC(первая строка) или больше или равныR * C - C(последняя строка), используя оператор|. Выводит элементыm[mask_edge]через пробел, затем ихshape. - Строит инвертированную маску
mask_inner = ~mask_edgeдля внутренних элементов. Выводит элементыm[mask_inner]через пробел, затем ихshape. - Выполняет
m[mask_inner] = -1— заменяет внутренние элементы на-1на месте. - Читает из
stdinодин целый индекс строкиr_idx. Строит маскуmask_row = m[r_idx] != -1для элементов указанной строки, которые не равны-1. Выводитm[r_idx][mask_row]через пробел, затемm[r_idx][~mask_row]через пробел.
Ввод и вывод
Программа читает stdin и пишет в stdout.
Формат ввода
Строка 1: два целых числа R C через пробел (R ≥ 3, C ≥ 2, R * C ≥ 6).
Строка 2: одно целое число r_idx — индекс строки (0 ≤ r_idx < R).
Формат вывода
Строка 1: элементы m[mask_edge] через пробел.
Строка 2: shape результата m[mask_edge] в виде (k,).
Строка 3: элементы m[mask_inner] через пробел.
Строка 4: shape результата m[mask_inner] в виде (k,).
Строка 5: элементы m[r_idx], которые не равны -1, через пробел (может быть пустой строкой, если таких нет).
Строка 6: элементы m[r_idx], которые равны -1, через пробел (может быть пустой строкой, если таких нет).
Пример
- Ввод
3 4 0
- Вывод
0 1 2 3 8 9 10 11 (8,) 4 5 6 7 (4,) 0 1 2 3
Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.
Отправьте решение, чтобы увидеть результаты тестов.
Связанные задачи
- NumPy: целочисленная индексация, присваивание и маска
- dtype NumPy: целые и вещественные массивы, типы элементов
- NumPy shape, ndim, size и dtype: атрибуты массива и задача
- Срезы двумерного массива NumPy: строки, столбцы и шаг
- NumPy reshape и transpose: разница на примере и задача
- NumPy newaxis и squeeze: вектор-строка и вектор-столбец
