Булева маска 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. Никаких заранее созданных переменных нет — вы читаете всё сами.

Что нужно сделать

Напишите программу, которая:

  1. Читает из stdin два целых числа R и C — размер двумерного массива.
  2. Создаёт массив m через np.arange(R * C).reshape(R, C) с dtype=int.
  3. Строит маску mask_edge для элементов, которые меньше C (первая строка) или больше или равны R * C - C (последняя строка), используя оператор |. Выводит элементы m[mask_edge] через пробел, затем их shape.
  4. Строит инвертированную маску mask_inner = ~mask_edge для внутренних элементов. Выводит элементы m[mask_inner] через пробел, затем их shape.
  5. Выполняет m[mask_inner] = -1 — заменяет внутренние элементы на -1 на месте.
  6. Читает из 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
РешениеPython

Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.

Отправьте решение, чтобы увидеть результаты тестов.

Связанные задачи