- •Об авторе
- •О научных редакторах
- •Благодарности
- •От издательства
- •Введение
- •Для кого эта книга?
- •Почему Python?
- •План книги
- •Версия Python, платформа и IDE
- •Установка Python
- •Запуск Python
- •Использование виртуальной среды
- •Вперед!
- •Глава 1. Спасение моряков с помощью теоремы Байеса
- •Теорема Байеса
- •Проект #1. Поиск и спасение
- •Стратегия
- •Установка библиотек Python
- •Код для теоремы Байеса
- •Время сыграть
- •Итоги
- •Дополнительная литература
- •Усложняем проект. Более грамотный поиск
- •Усложняем проект. Поиск лучшей стратегии с помощью MCS
- •Усложняем проект. Вычисление вероятности обнаружения
- •Глава 2. Установление авторства с помощью стилометрии
- •Проект #2: «Собака Баскервилей», «Война миров» и «Затерянный мир»
- •Стратегия
- •Установка NLTK
- •Корпусы текстов
- •Код стилометрии
- •Итоги
- •Дополнительная литература
- •Практический проект: охота на собаку Баскервилей с помощью распределения
- •Практический проект: тепловая карта пунктуации
- •Усложняем проект: фиксирование частотности
- •Глава 3. Суммаризация текста с помощью обработки естественного языка
- •Стратегия
- •Веб-скрапинг
- •Код для «У меня есть мечта»
- •Установка gensim
- •Код для суммаризации речи «Заправляйте свою кровать»
- •Проект #5. Суммаризация речи с помощью облака слов
- •Модули Word Cloud и PIL
- •Код для создания облака слов
- •Итоги
- •Дополнительная литература
- •Усложняем проект: ночные игры
- •Усложняем проект: суммаризация суммаризаций
- •Глава 4. Отправка суперсекретных сообщений с помощью книжного шифра
- •Одноразовый блокнот
- •Шифр «Ребекка»
- •Проект #6. Цифровой ключ к «Ребекке»
- •Стратегия
- •Код для шифрования
- •Отправка сообщений
- •Итоги
- •Дополнительная литература
- •Глава 5. Поиск Плутона
- •Проект #7. Воссоздание блинк-компаратора
- •Стратегия
- •Данные
- •Код блинк-компаратора
- •Использование блинк-компаратора
- •Проект #8. Обнаружение астрономических транзиентов путем дифференцирования изображений
- •Стратегия
- •Код для детектора транзиентов
- •Использование детектора транзиентов
- •Итоги
- •Дополнительная литература
- •Практический проект: представление орбитальной траектории
- •Практический проект: найди отличия
- •Усложняем проект: сосчитаем звезды
- •Глава 6. Победа в лунной гонке с помощью «Аполлона-8»
- •Цель миссии «Аполлон-8»
- •Траектория свободного возврата
- •Задача трех тел
- •Проект #9. На Луну с «Аполлоном-8»!
- •Использование модуля turtle
- •Стратегия
- •Код программы для расчета свободного возврата «Аполлона-8»
- •Выполнение симуляции
- •Итоги
- •Дополнительная литература
- •Практический проект: симуляция шаблона поисков
- •Практический проект: запусти меня!
- •Практический проект: останови меня!
- •Усложняем проект: симуляция в истинном масштабе
- •Усложняем проект: реальный «Аполлон-8»
- •Глава 7. Выбор мест высадки на Марсе
- •Посадка на Марс
- •Карта MOLA
- •Проект #10. Выбор посадочных мест на Марсе
- •Стратегия
- •Код для выбора мест посадки
- •Результаты
- •Итоги
- •Дополнительная литература
- •Практический проект: убедимся, что рисунки становятся частью изображения
- •Практический проект: визуализация профиля высот
- •Практический проект: отображение в 3D
- •Практический проект: совмещение карт
- •Усложняем проект: три в одном
- •Усложняем проект: перенос прямоугольников
- •Глава 8. Обнаружение далеких экзопланет
- •Транзитная фотометрия
- •Проект #11. Симуляция транзита экзопланеты
- •Стратегия
- •Код для транзита
- •Эксперименты с транзитной фотометрией
- •Проект #12. Получение изображений экзопланет
- •Стратегия
- •Код для пикселизатора
- •Итоги
- •Дополнительная литература
- •Практический проект: обнаружение инопланетных мегаструктур
- •Практический проект: обнаружение транзита астероидов
- •Практический проект: добавление эффекта потемнения к краю
- •Практический проект: обнаружение пятен на звездах
- •Практический проект: обнаружение инопланетной армады
- •Практический проект: обнаружение планеты с луной
- •Практический проект: измерение продолжительности экзопланетного дня
- •Усложняем проект: генерация динамической кривой блеска
- •Глава 9. Как различить своих и чужих
- •Обнаружение лиц на фотографиях
- •Проект #13. Программирование робота-часового
- •Стратегия
- •Результаты
- •Обнаружение лиц в видеопотоке
- •Итоги
- •Дополнительная литература
- •Практический проект: размытие лиц
- •Усложняем проект: обнаружение кошачьих мордочек
- •Глава 10. Ограничение доступа по принципу распознавания лиц
- •Распознавание лиц с помощью LBPH
- •Схема распознавания лиц
- •Извлечение гистограмм локальных бинарных шаблонов
- •Проект #14. Ограничение доступа к инопланетному артефакту
- •Стратегия
- •Поддержка модулей и файлов
- •Код для захвата видео
- •Код для обучения алгоритма распознавания лиц
- •Код для прогнозирования лиц
- •Результаты
- •Итоги
- •Дополнительная литература
- •Усложняем проект: добавление пароля и видеозахвата
- •Усложняем проект: похожие лица и близнецы
- •Усложняем проект: машина времени
- •Глава 11. Создание интерактивной карты побега от зомби
- •Проект #15. Визуализация плотности населения с помощью хороплетной карты
- •Стратегия
- •Библиотека анализа данных
- •Библиотеки bokeh и holoviews
- •Установка pandas, bokeh и holoviews
- •Работа с данными по уровню безработицы и плотности населения в округах и штатах
- •Разбираем код holoviews
- •Код для отрисовки хороплетной карты
- •Планирование маршрута
- •Итоги
- •Дополнительная литература
- •Усложняем проект: отображение на карте изменения численности населения США
- •Глава 12. Находимся ли мы в компьютерной симуляции?
- •Проект #16. Жизнь, Вселенная и пруд черепахи Йертл
- •Код симуляции пруда
- •Следствия симуляции пруда
- •Измерение затрат на пересечение строк или столбцов сетки
- •Результаты
- •Стратегия
- •Итоги
- •Дополнительная литература
- •Дополнение
- •Усложняем проект: поиск безопасного места в космосе
- •Усложняем проект: а вот и Солнце
- •Усложняем проект: взгляд глазами собаки
- •Усложняем проект: кастомизированный поиск слов
- •Усложняем проект: что за сложную паутину мы плетем
- •Усложняем проект: идем вещать с горы
- •Решения для практических проектов
- •Глава 2. Определение авторства с помощью стилометрии
- •Охота на собаку Баскервилей с помощью распределения
- •Тепловая карта пунктуации
- •Глава 4. Отправка суперсекретных сообщений с помощью книжного шифра
- •Составление графика символов
- •Отправка секретов шифром времен Второй мировой войны
- •Глава 5. Поиск Плутона
- •Представление орбитальной траектории
- •Глава 6. Победа в лунной гонке с помощью «Аполлона-8»
- •Симуляция шаблона поисков
- •Заведи меня!
- •Останови меня!
- •Глава 7. Выбор мест высадки на Марсе
- •Убеждаемся, что рисунки становятся частью изображения
- •Визуализация профиля высоты
- •Отображение в 3D
- •Совмещение карт
- •Глава 8. Обнаружение далеких экзопланет
- •Обнаружение инопланетных мегаструктур
- •Обнаружение транзита астероидов
- •Добавление эффекта потемнения к краю
- •Обнаружение инопланетной армады
- •Обнаружение планеты с луной
- •Измерение продолжительности экзопланетного дня
- •Глава 9. Как различить своих и чужих
- •Размытие лиц
- •Глава 10. Ограничение доступа по принципу распознавания лиц
- •Усложняем проект: добавление пароля и видеозахвата
362 Решения для практических проектов
practice_montage_difference_finder.py
practice_montage_difference_finder.py import cv2 as cv
filename1 = 'montage_left.JPG' filename2 = 'montage_right_gray.JPG'
img1 = cv.imread(filename1, cv.IMREAD_GRAYSCALE) img2 = cv.imread(filename2, cv.IMREAD_GRAYSCALE)
# Абсолютная разница между изображениями 2 и 3: diff_imgs1_2 = cv.absdiff(img1, img2)
cv.namedWindow('Difference', cv.WINDOW_NORMAL) diff_imgs1_2_resize = cv.resize(diff_imgs1_2, (699, 700)) cv.imshow('Difference', diff_imgs1_2_resize)
crop_diff = diff_imgs1_2[10:2795, 10:2445] # x, y, w, h = 10, 10, 2790, 2440
# Применяем размытие для удаления лишнего шума. blurred = cv.GaussianBlur(crop_diff, (5, 5), 0)
(minVal, maxVal, minLoc, maxLoc2) = cv.minMaxLoc(blurred) cv.circle(img2, maxLoc2, 100, 0, 3)
x, y = int(img2.shape[1]/4), int(img2.shape[0]/4) img2_resize = cv.resize(img2, (x, y)) cv.imshow('Change', img2_resize)
Глава 6. Победа в лунной гонке с помощью «Аполлона-8»
Симуляция шаблона поисков
practice_search_pattern.py
import time import random import turtle
SA_X = 600 # Ширина области поиска.
SA_Y = 480 # Длина области поиска.
TRACK_SPACING = 40 # Расстояние между треками поиска.
#Настройка экрана. screen = turtle.Screen()
screen.setup(width=SA_X, height=SA_Y) turtle.resizemode('user') screen.title("Search Pattern")
rand_x = random.randint(0, int(SA_X / 2)) * random.choice([-1, 1]) rand_y = random.randint(0, int(SA_Y / 2)) * random.choice([-1, 1])
#Настройка изображений черепах .
Глава 6. Победа в лунной гонке с помощью «Аполлона-8» 363
seaman_image = 'seaman.gif' screen.addshape(seaman_image) copter_image_left = 'helicopter_left.gif' copter_image_right = 'helicopter_right.gif' screen.addshape(copter_image_left) screen.addshape(copter_image_right)
#Инстанцирование указателя моряка. seaman = turtle.Turtle(seaman_image) seaman.hideturtle()
seaman.penup() seaman.setpos(rand_x, rand_y) seaman.showturtle()
#Инстанцирование указателя вертолета. turtle.shape(copter_image_right) turtle.hideturtle() turtle.pencolor('black') turtle.penup()
turtle.setpos(-(int(SA_X / 2) - TRACK_SPACING), int(SA_Y / 2) - TRACK_ SPACING)
turtle.showturtle()
turtle.pendown()
#Выполняем шаблон поиска и объявляем о нахождении моряка.
for i in range(int(SA_Y / TRACK_SPACING)): turtle.fd(SA_X - TRACK_SPACING * 2) turtle.rt(90)
turtle.fd(TRACK_SPACING / 2) turtle.rt(90) turtle.shape(copter_image_left) turtle.fd(SA_X - TRACK_SPACING * 2) turtle.lt(90) turtle.fd(TRACK_SPACING / 2) turtle.lt(90) turtle.shape(copter_image_right)
if turtle.ycor() - seaman.ycor() <= 10: turtle.write(" Seaman found!",
align='left',
font=("Arial", 15, 'normal', 'bold', 'italic'))
time.sleep(3)
break
Заведи меня!
practice_grav_assist_stationary.py
"""gravity_assist_stationary.py
Луна приближается к неподвижному кораблю, закручивая его вокруг себя и запуская вдаль.
Реализация: Эрик Т. Мортенсон
"""
364 Решения для практических проектов
from turtle import Shape, Screen, Turtle, Vec2D as Vec import turtle
import math
# Пользовательский ввод:
G = 8 # Гравитационная константа, используемая в симуляции. NUM_LOOPS = 4100 # Число временных шагов в симуляции.
Ro_X = 0 # Координата x стартовой позиции корабля. Ro_Y = -50 # Координата y стартовой позиции корабля. Vo_X = 0 # Компонент x скорости корабля.
Vo_Y = 0 # Компонент y скорости корабля.
MOON_MASS = 1_250_000
class GravSys():
"""Выполняем гравитационную симуляцию для n тел."""
def __init__(self): self.bodies = [] self.t = 0 self.dt = 0.001
def sim_loop(self):
"""Прогоняем тела из списка через временные шаги.""" for _ in range(NUM_LOOPS):
self.t += self.dt
for body in self.bodies: body.step()
class Body(Turtle):
"""Небесный объект, вращающийся по орбите и проецирующий гравитационное поле."""
def __init__(self, mass, start_loc, vel, gravsys, shape): super().__init__(shape=shape)
self.gravsys = gravsys self.penup() self.mass=mass self.setpos(start_loc) self.vel = vel gravsys.bodies.append(self)
self.pendown() # Раскомментируйте, чтобы рисовать путь позади объектов
def acc(self):
"""Вычисляем совместное действие сил на тело и возвращаем компоненты вектора."""
a = Vec(0,0)
for body in self.gravsys.bodies: if body != self:
r = body.pos() - self.pos()
a += (G * body.mass / abs(r)**3) * r # единицы расстояние/время^2
return a
Глава 6. Победа в лунной гонке с помощью «Аполлона-8» 365
def step(self):
"""Вычисляем позицию, ориентацию и скорость тела.""" dt = self.gravsys.dt
a = self.acc()
self.vel = self.vel + dt * a
xOld, yOld = self.pos() # для ориентации корабля. self.setpos(self.pos() + dt * self.vel)
xNew, yNew = self.pos() # для ориентации корабля. if self.gravsys.bodies.index(self) == 1: # the CSM
dir_radians = math.atan2(yNew-yOld,xNew-xOld) # для ориентации корабля.
dir_degrees = dir_radians * 180 / math.pi # для ориентации корабля.
self.setheading(dir_degrees+90) # для ориентации корабля.
def main():
#Настраиваем экран. screen = Screen()
screen.setup(width=1.0, height=1.0) # для полноэкранного режима screen.bgcolor('black')
screen.title("Gravity Assist Example")
#Инстанцируем гравитационную систему.
gravsys = GravSys()
# Инстанцируем планету. image_moon = 'moon_27x27.gif' screen.register_shape(image_moon)
moon = Body(MOON_MASS, (500, 0), Vec(-500, 0), gravsys, image_moon) moon.pencolor('gray')
#Создаем командно-сервисный модуль (csm). csm = Shape('compound')
cm = ((0, 30), (0, -30), (30, 0)) csm.addcomponent(cm, 'red', 'red')
sm = ((-60,30), (0, 30), (0, -30), (-60, -30)) csm.addcomponent(sm, 'red', 'black')
nozzle = ((-55, 0), (-90, 20), (-90, -20)) csm.addcomponent(nozzle, 'red', 'red') screen.register_shape('csm', csm)
#Инстанцируем указатель CSM "Аполлона-8"
ship = Body(1, (Ro_X, Ro_Y), Vec(Vo_X, Vo_Y), gravsys, "csm") ship.shapesize(0.2)
ship.color('red') # цвет траектории ship.getscreen().tracer(1, 0) ship.setheading(90)
gravsys.sim_loop()
if __name__=='__main__': main()