Нашли ошибку?
Скачать чистый
мини-проект≈ 20 минупражнения: 0 из 7

Мини-проект: картинка из чисел

Чёрно-белая картинка — это таблица из нулей и единиц. Нарисовать рамку и крест срезами, посчитать закрашенные точки, отразить, повернуть и обрезать изображение.

Python запустится при первом выполнении

Цифровая картинка — это двумерный массив: каждый элемент — точка (пиксель, pixel), а число — её цвет. В чёрно-белой картинке достаточно двух чисел: 0 — пусто, 1 — закрашено. В этом проекте мы будем рисовать и преобразовывать картинки только срезами, .T и итогами — всем, что было в модуле.

Чтобы видеть картинку, а не столбики чисел, напишем маленькую функцию show: единицы она печатает квадратиком, нули — точкой.

[ ]Функция show и пустой холст
import numpy as np


def show(picture):
    for row in picture:          # цикл for по таблице перебирает её строки
        line = ""
        for value in row:        # а по строке — её элементы
            if value:
                line += "█"      # 1 — закрашенная точка
            else:
                line += "·"      # 0 — пустая
        print(line)


show(np.zeros((3, 8), dtype=int))
Выводсохранённый · нажмите «Выполнить», чтобы получить свой
········
········
········

Шаг 1. Рамка

Присваивание в срез закрашивает сразу целую строку или столбец: canvas[0] = 1 — верхняя строка, canvas[:, -1] = 1 — правый столбец.

[ ]Упражнение 1Рамка по краю решено

Холст frame — нули 6 × 10. Нарисуйте на нём рамку: закрасьте первую и последнюю строки и первый и последний столбцы.

frame = np.zeros((6, 10), dtype=int)

Шаг 2. Крест

[ ]Упражнение 2Знак плюс решено

Холст plus — нули 7 × 7. Нарисуйте в нём крест: закрасьте среднюю строку и средний столбец (индекс 3).

plus = np.zeros((7, 7), dtype=int)

Шаг 3. Сколько закрашено

[ ]Упражнение 3Число закрашенных точек решено

Сохраните в lit число закрашенных точек креста plus.

lit = ...

[ ]Крест и число закрашенных точек
show(plus)
print("закрашено:", lit)
Выводсохранённый · нажмите «Выполнить», чтобы получить свой
···█···
···█···
···█···
███████
···█···
···█···
···█···
закрашено: 13
Вывод появится, когда решите упражнение «Число закрашенных точек», — иначе он подскажет ответ. Ячейку можно и выполнить.

Строка и столбец креста по 7 точек, но центральную точку закрасили оба раза — это одна и та же точка: 7 + 7 − 1 = 13.

Пояснение с ответом появится, когда решите упражнение «Число закрашенных точек».

Шаг 4. Отражения

Срез с шагом −1 разворачивает ось: [::-1] — строки в обратном порядке (отражение сверху вниз), [:, ::-1] — столбцы в обратном порядке (отражение слева направо). Вот стрелка вверх:

[ ]Стрелка вверх
up = np.array([
    [0, 0, 1, 0, 0],
    [0, 1, 1, 1, 0],
    [1, 0, 1, 0, 1],
    [0, 0, 1, 0, 0],
    [0, 0, 1, 0, 0],
])
right = np.array([
    [0, 0, 1, 0, 0],
    [0, 0, 0, 1, 0],
    [1, 1, 1, 1, 1],
    [0, 0, 0, 1, 0],
    [0, 0, 1, 0, 0],
])
show(up)
Выводсохранённый · нажмите «Выполнить», чтобы получить свой
··█··
·███·
█·█·█
··█··
··█··
[ ]Упражнение 4Стрелка вниз решено

Отразите стрелку up сверху вниз и сохраните результат в down.

down = ...

[ ]Упражнение 5Стрелка влево решено

Стрелка right смотрит вправо. Отразите её слева направо и сохраните в left.

left = ...

Шаг 5. Поворот

Поворот на 90° по часовой стрелке складывается из двух шагов: транспонировать (.T), а потом отразить слева направо. Попробуйте на бумажке с углом «Г» — и убедитесь.

[ ]Упражнение 6Повернуть букву Г решено

В заготовке — картинка letter 4 × 3: буква «Г». Поверните её на 90° по часовой стрелке и сохраните в turned. Проверьте себя: у повёрнутой картинки 3 строки и 4 столбца, а перекладина буквы уходит вниз по правому краю.

letter = np.array([
    [1, 1, 1],
    [1, 0, 0],
    [1, 0, 0],
    [1, 0, 0],
])
turned = ...

Шаг 6. Обрезка

[ ]Упражнение 7Центр картинки решено

Картинка photo — 8 × 8. Вырежьте из неё центральный квадрат 4 × 4 (строки и столбцы с индексами 2–5) и сохраните в center.

photo = np.arange(64).reshape(8, 8)
center = ...

[ ]Результат
for picture in (frame, down, left, turned):
    show(picture)
    print()
Выводсохранённый · нажмите «Выполнить», чтобы получить свой
██████████
█········█
█········█
█········█
█········█
██████████

··█··
··█··
█·█·█
·███·
··█··

··█··
·█···
█████
·█···
··█··

████
···█
···█
Итог появится, когда решите все упражнения урока, — в нём ответы. Ячейку можно и выполнить.

Настоящие фотографии устроены так же, только чисел больше: в цветной картинке у каждой точки три числа — красный, зелёный и синий, и массив получается трёхмерным. Обрезка, повороты и отражения в графических редакторах — это те же срезы.

Подробнее в справочнике

Практика по модулю

Задачи по NumPy для самостоятельной практики появятся в разделе «Задачи → NumPy».

Нашли ошибку?