0% нашли этот документ полезным (0 голосов)
5 просмотров97 страниц

Python (2019)

Учебное пособие С. А. Хайбрахманова 'Основы научных расчётов на языке программирования Python' излагает базовые принципы программирования на Python и использование библиотек NumPy, Matplotlib и SciPy для научных расчетов. Оно предназначено для студентов, обучающихся по направлениям физики и радиофизики, и включает примеры решения математических и физических задач. Пособие также содержит задания для самостоятельной работы и вопросы для самоконтроля.
Авторское право
© All Rights Reserved
Мы серьезно относимся к защите прав на контент. Если вы подозреваете, что это ваш контент, заявите об этом здесь.
Доступные форматы
Скачать в формате PDF, TXT или читать онлайн в Scribd
0% нашли этот документ полезным (0 голосов)
5 просмотров97 страниц

Python (2019)

Учебное пособие С. А. Хайбрахманова 'Основы научных расчётов на языке программирования Python' излагает базовые принципы программирования на Python и использование библиотек NumPy, Matplotlib и SciPy для научных расчетов. Оно предназначено для студентов, обучающихся по направлениям физики и радиофизики, и включает примеры решения математических и физических задач. Пособие также содержит задания для самостоятельной работы и вопросы для самоконтроля.
Авторское право
© All Rights Reserved
Мы серьезно относимся к защите прав на контент. Если вы подозреваете, что это ваш контент, заявите об этом здесь.
Доступные форматы
Скачать в формате PDF, TXT или читать онлайн в Scribd

Министерство науки и высшего образования Российской Федерации

Федеральное государственное бюджетное образовательное учреждение


высшего образования
«Челябинский государственный университет»

С. А. Хайбрахманов

ОСНОВЫ НАУЧНЫХ РАСЧЁТОВ


НА ЯЗЫКЕ ПРОГРАММИРОВАНИЯ
PYTHON
Учебное пособие

Челябинск
Издательство Челябинского государственного университета
2019
УДК 004(075.8)
ББК З973я7
Х154

Печатается по решению редакционно-издательского совета


Челябинского государственного университета

Р е ц е н з е н т ы:
кафедра вычислительной механики
факультета математики, механики и компьютерных технологий
Южно-Уральского государственного университета (НИУ);
К. Л. Маланчев, кандидат физико-математических наук,
научный сотрудник отдела релятивистской астрофизики
Государственного астрономического института имени П. К. Штернберга
Московского государственного университета имени М. В. Ломоносова

Хайбрахманов, С. А.
Х154 Основы научных расчётов на языке программирования
Python : учеб. пособие / С. А. Хайбрахманов. — Челябинск : Изд-
во Челяб. гос. ун-та, 2019. — 96 с.
ISBN 978-5-7271-1629-6
Излагаются основы научных расчётов на языке программиро-
вания Python. Приводятся и демонстрируются базовые возмож-
ности библиотек NumPy для работы с многомерными массивами,
Matplotlib для визуализации данных и SciPy для научных расчётов
и анализа данных. Рассматриваются примеры решения некото-
рых математических и физических задач с помощью библиотек
NumPy, Matplotlib и SciPy.
Предназначено для практических занятий и самостоятельной
работы по дисциплине «Компьютерные технологии в науке и об-
разовании» для студентов, обучающихся по направлениям 03.04.02
Физика, 03.04.03 Радиофизика.
Ил. 11. Библиогр.: 6 назв.

УДК 004.432.2(075.8)
ББК З973.22я73-1

ISBN 978-5-7271-1629-6 © Хайбрахманов С. А., 2019


© Челябинский государст­венный
университет, 2019
Оглавление

Предисловие. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

Используемые обозначения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

Г л а в а 1. Основы программирования на языке Python. . . . . . . . 9


1.1. Базовые сведения о Python. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.2. Установка Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
1.3. Интерактивный режим работы . . . . . . . . . . . . . . . . . . . . . . 12
1.4. Типы данных. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.5. Операции и логические операторы . . . . . . . . . . . . . . . . . . . 20
1.6. Ввод/вывод . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
1.7. Управляемые блоки кода в Python . . . . . . . . . . . . . . . . . . . . 23
1.8. Функции . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
1.9. Работа с библиотеками. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
1.10. Написание файлов исходного кода. . . . . . . . . . . . . . . . . . . 32
1.11. Создание и использование собственных модулей . . . . 35
Примеры решения задач . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
Задания для самостоятельной работы. . . . . . . . . . . . . . . 40
Вопросы для самоконтроля. . . . . . . . . . . . . . . . . . . . . . . . . . 41
Рекомендуемая литература . . . . . . . . . . . . . . . . . . . . . . . . . 41

Г л а в а 2. Б
 иблиотека NumPy для работы
с многомерными массивами . . . . . . . . . . . . . . . . . . . . . . . 43
2.1. Общие сведения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
2.2. Создание массивов NumPy . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
2.3. Доступ к элементам массива . . . . . . . . . . . . . . . . . . . . . . . . . 46
2.4. Функции для работы с массивами. . . . . . . . . . . . . . . . . . . . 50
2.5. Универсальные функции . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
2.6. Работа с файлами . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
Задание для самостоятельной работы. . . . . . . . . . . . . . . 55
Вопросы для самоконтроля. . . . . . . . . . . . . . . . . . . . . . . . . . 57
Рекомендуемая литература . . . . . . . . . . . . . . . . . . . . . . . . . 57

3
Оглавление

Г л а в а 3. Библиотека визуализации Matplotlib. . . . . . . . . . . . . . . 58


3.1. Общие сведения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
3.2. Создание простого рисунка с параметрами
по умолчанию. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
3.3. Создание рисунка с настраиваемыми параметрами. . . 61
3.4. Добавление нескольких панелей на рисунок. . . . . . . . . . 68
3.5. Двумерные графики . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
3.6. Визуализация данных из текстовых файлов . . . . . . . . . . 76
3.7. Математические символы на рисунках. . . . . . . . . . . . . . . 78
Задание для самостоятельной работы. . . . . . . . . . . . . . . 78
Вопросы для самоконтроля. . . . . . . . . . . . . . . . . . . . . . . . . . 79
Рекомендуемая литература . . . . . . . . . . . . . . . . . . . . . . . . . 79

Г л а в а 4. Библиотека SciPy для научных


и инженерных расчётов. . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
4.1. Общие сведения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
4.2. Численное интегрирование. . . . . . . . . . . . . . . . . . . . . . . . . . 82
4.3. Решение обыкновенных дифференциальных
уравнений . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
4.4. Интерполяция. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
Варианты заданий для самостоятельной работы . . . . 91
Вопросы для самоконтроля. . . . . . . . . . . . . . . . . . . . . . . . . . 92
Рекомендуемая литература . . . . . . . . . . . . . . . . . . . . . . . . . 93

Заключение. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94

Список литературы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96

4
Предисловие

Учебное пособие посвящено основам программирования на язы-


ке Python и работы с библиотеками NumPy, Matplotlib и SciPy для
проведения научных расчётов.
Язык Python является интерпретируемым высокоуровне-
вым языком программирования, поддерживающим разработку
программ с использованием структурного, функционального,
объектно-­ориентированного и др. подходов. Отличительными
чертами языка являются кроссплатформенность, динамическая
типизация, автоматическое управление памятью, интроспекция,
высокоуровневые структуры данных. Синтаксис Python легко чи-
таем. С помощью Python создаётся как системное, так и приклад-
ное программное обеспечение, программы с графическим интер-
фейсом, веб-приложения, программы для научных расчётов и т. д.
Python имеет богатую стандартную библиотеку. Кроме того, для
Python написано большое количество прикладных библиотек,
в том числе для научных расчётов, которые позволяют решать ряд
математических задач без необходимости самостоятельной разра-
ботки алгоритмов.
Проведение как теоретических, так и практических научных
исследований включает в себя решение различных математиче-
ских задач, таких как: нахождение корней алгебраических урав-
нений, задачи линейной алгебры, вычисление интег­ралов, реше-
ние систем обыкновенных дифференциальных уравнений, ап-
проксимация и интерполяция данных и т. д. Важным элементом
анализа научных результатов является визуализация данных.
Найти точное решение математических задач в реальных при-
ложениях зачастую не удаётся, что обусловливает необходимость
использования алгоритмов численного решения.
К настоящему времени разработано, реализовано и протести-
ровано большое количество библиотек и программных паке-
тов как для аналитического, так и для численного решения на-
учных задач. Использование таких пакетов избавляет учёных

5
Предисловие

от ­необходимости тратить время на разработку и реализацию ал-


горитмов решения стандартных математических задач и позволя-
ет сконцент­рироваться на анализе получаемых решений.
Наиболее известными коммерческими пакетами для проведе-
ния научных и инженерных расчётов являются пакет программ
MATLAB, системы компьютерной алгебры Mathcad, Maple и Mathe­
matica. Указанные программные пакеты имеют продвинутые
и удобные графические интерфейсы, собственные высокоуровне-
вые языки программирования и позволяют решать большое ко-
личество математических и инженерных задач, а также визуали-
зировать данные и получать рисунки высокого качества. Однако
возможность использования данных пакетов индивидуальны-
ми исследователями и небольшими организациями затруднена
по причине высокой стоимости их лицензий.
Существует ряд бесплатных программных пакетов и библио-
тек для проведения научных расчётов, анализа и визуализации
данных. Среди них можно выделить пакеты для численных рас-
чётов Scilab (URL: [Link] и Octave (URL: https://
[Link]/software/octave/), систему компьютерной алгебры
Maxima (URL: [Link] систе-
му для статистических расчётов и визуализации данных на ос-
нове языка программирования R (URL: [Link]
а также биб­л иотеки NumPy для работы с многомерными масси-
вами, Matplotlib для визуализации данных и SciPy для научных
и инженерных расчётов на языке программирования Python. Со-
вместные возможности библиотек NumPy, Matplotlib и SciPy близ-
ки к возможностям MATLAB. Данные библиотеки в настоящее
время активно развиваются и являются одним из лидирующих
бесплатных инструментов для решения стандартных математи-
ческих задач и анализа данных.
Целью данного пособия является ознакомление студентов
с основными возможностями языка Python и библиотек NumPy,
Matplotlib и SciPy. Изложенный материал основан на многолетнем
опыте автора по использованию указанных библиотек для прове-
дения расчётов, анализа и визуализации данных. В пособии изло-
жен необходимый минимум знаний для написания простейших
программ на Python и применения библиотек NumPy, Matplotlib
и SciPy. Для чтения пособия не требуется предварительных зна-

6


ний языка Python, однако необходимы базовые знания в области


структурного, функционального и объектно-ориентированного
программирования. Для лучшего понимания материала приво-
дится сравнение основных понятий и синтаксиса Python с распро-
странёнными языками программирования C и Pascal. Для полу-
чения дополнительной информации в конце каждой главы при-
ведён список рекомендуемой литературы.
Учебное пособие организовано следующим образом. В первой
главе рассматриваются основы программирования на Python: опи-
сывается интерактивный режим работы и написание файлов ис-
ходного кода, основные типы данных и операторы, работа с функ-
циями, библиотеками и модулями. Во второй главе описываются
возможности библиотеки NumPy по работе с многомерными мас-
сивами. В третьей главе приводятся основные способы визуализа-
ции данных с помощью библиотеки Matplotlib: построение одно-
мерных и двумерных графиков, настройка подписей и внешнего
вида рисунков, сохранение рисунков в файлы, визуализация дан-
ных из файлов. В четвёртой главе рассматриваются некоторые воз-
можности библиотеки SciPy: численное интегрирование, решение
систем обыкновенных дифференциальных уравнений, интерпо-
ляция.

7
Используемые обозначения

Будем выделять названия библиотек, модулей, функций, ти-


пов данных, имена файлов и зарезервированные слова жирным
шрифтом Times New Roman, например: Matplotlib, pyplot , plot(),
float, [Link], for и т. д.
Переменные в тексте обозначаются наклонным шрифтом Times
New Roman: x, y, ‘string’ и т. д.
Строки программного кода в тексте записываются шрифтом
Consolas чёрного цвета и сопровождаются линией по левому
полю:
import [Link] as plt

Комментарии и строки в тексте программ выделяются шрифтом


Consolas серого цвета и сопровождаются линией по левому полю:
# однострочный комментарий

"""
Строка, разделённая
На несколько строчек
"""
Ожидание ввода команды в окне интерактивной оболочки
IPython:
In [N]: |

где N — натуральное число (1, 2, 3 …), указывающее текущий но-


мер команды и номер результата от момента начала работы с обо-
лочкой.
Результат выполнения предыдущей команды:
Out [N]: <Ans>

где N — натуральное число (1, 2, 3 …), указывающее номер резуль-


тата, <Ans> — результат выполнения команды.

8
Глава 1 
Основы программирования
на языке Python

В данной главе рассматриваются основы программирования


на языке Python и базовые функции интегрированной среды раз-
работки Spyder (URL: [Link] Теоретический
материал сопровождается примерами интерактивной работы
в IDE Spyder и написания файлов исходного кода. Приводятся при-
меры программ. В завершение приводится список заданий для са-
мостоятельной работы и вопросы для самоконтроля.

1.1. Базовые сведения о Python


Python является высокоуровневым языком программирования
(URL: [Link] Основные особенности языка:
•• Python поддерживает структурное, функциональное и объектно-­
ориентированное программирование.
•• Python — интерпретируемый язык программирования. Это
озна­ч ает, что программный код на языке Python не компили-
руется перед его исполнением в отличие от таких языков, как C
и Fortran. Код выполняется специальной программой-интерпрета-
тором. Интерпретатор считывает высокоуровневую программу —
исходный код — и, напрямую взаимодействуя с операционной сис­
темой, выполняет программу. Преобразование и выполнение про-
граммы осуществляется построчно.
•• Python поддерживает динамическую типизацию — связыва-
ние переменной с типом в момент присваивания ей значения.
•• В Python реализовано автоматическое управление памятью.
Это означает, что пользователю нет необходимости вручную вы-
делять и удалять память для динамических переменных.
•• Python поддерживает интерактивный режим работы.

9
Глава 1. Основы программирования на языке Python

•• Для Python написано большое количество свободно распро-


страняемых библиотек, в том числе библиотек для научных рас-
чётов.
•• Синтаксис языка Python является легко читаемым и непере-
груженным.
•• Интерпретатор Python является свободно распространяе-
мым программным обеспечением с открытым исходным ко-
дом. Эталонной реализацией интерпретатора является CPython
(URL: [Link]
•• Кроссплатформенность: Python портирован на большинство
существующих платформ, в том числе Windows, Linux и Mac OS X.
Программный код, написанный на Python, может выполнять-
ся на любой платформе, на которой установлен интерпретатор
Python.

1.2. Установка Python

В данном учебном пособии будут рассмотрены примеры про-


граммирования на Python на платформе Windows. Для установки
всех необходимых инструментов для программирования удобно
воспользоваться одним из наиболее развивающихся на данный
момент дистрибутивов — Anaconda (URL: [Link]
com/download/). Он включает в себя интерпретатор языка Python,
стандартные библиотеки Python, интегрированную среду разра-
ботки (IDE) Spyder с интерактивной оболочкой IPython, менеджер
пакетов conda, а также набор библиотек для научных и инженер-
ных расчётов: NumPy [1] (URL: [Link] SciPy [2–4] (URL:
[Link] Matplotlib [6] (URL: [Link]
и др.
В данном учебном пособии рассмотрены примеры интерактив-
ной работы в оболочке IPython (URL: [Link] и примеры
написания программ на языке Python. В обоих случаях для напи-
сания и запуска программ будет использована интегрированная
среда разработки Spyder. При написании пособия использовался
Python версии 3.6, IDE Spyder версии 3.0.

10
1.2. Установка Python

По умолчанию рабочее пространство IDE Spyder имеет три ос-


новных области (рис. 1):
•• Текстовый редактор (отображается в левой части рабочего
пространства). Предназначен для написания программ на языке
Python. В редакторе реализованы подсветка синтаксиса, динами-
ческая интроспекция кода (автодополнение вводимых команд,
переход к определению объекта по щелчку мыши) и нахождение
ошибок на лету.
•• Окно справки (отображается справа сверху).
•• Окно интерактивной оболочки IPython (отображается справа
снизу), которое также называется «консоль». Консоль предназна-
чена для работы в интерактивном режиме, то есть в режиме диа-
лога, когда введённые пользователем команды сразу же выполня-
ются и результат выводится в консоли на экран.

Рис. 1. Внешний вид и основные элементы интегрированной среды


разработки Spyder

11
Глава 1. Основы программирования на языке Python

1.3. Интерактивный режим работы

В интерактивном режиме работы введённые пользователем


с клавиатуры команды сразу же выполняются интерпретатором,
а результат выводится на экран в окне консоли. Работа с интерпре-
татором осуществляется в окне оболочки IPython. Каждая строка
ввода/вывода в IPython последовательно нумеруется. Например,
запустим Spyder и введём в командной строке интерактивной обо-
лочки IPython
In [1]: 20 + 1

После нажатия клавиши Enter интерпретатор выполняет вве-


дённую пользователем команду и выводит результат её работы
на экран:
Out [1]: 21

Порядковый номер, указываемый в квадратных скобках после


слова Out, позволяет обращаться к ранее полученному результа-
ту. Например, чтобы вычесть из числа 3 результат, вычисленный
в предыдущей команде, напишем
In [2]: 3 - Out[1]

После нажатия клавиши Enter на экран будет выведен резуль-


тат:
Out [2]: -18

Справку на английском языке по любому объекту можно полу-


чить, набрав в окне IPython имя объекта со знаком ? Например,
справка по функции type()
In [3]: type?
Docstring:
type(object) -> the object’s type
type(name, bases, dict) -> a new type
Type: type

Для вывода на экран значения переменной в интерактивном ре-


жиме достаточно написать в консоли имя переменной и нажать

12
1.4. Типы данных

Enter, например:
In [4]: Out[2]
Out [4]: -18

Клавиши стрелок «вверх» и «вниз» на клавиатуре позволяют


просматривать ранее введённые команды и выполнять их заново.
В IPython реализовано автоматическое дополнение имён вводи-
мых пользователем ключевых слов, имён модулей функций, пере-
менных и имён файлов в текущей директории. Автодополнение
имён делается с помощью клавиши TAB на клавиатуре. Например,
если ввести в консоли символы ty и нажать клавишу TAB, интер-
претатор автоматически дополнит вводимую пользователем кон-
струкцию до имени type.

1.4. Типы данных


Типы данных в Python можно разделить на два класса: атомар-
ные и структурные.
Атомарные типы данных: число с плавающей точкой (float),
целое число (int), логический тип (bool), комплексное число
(complex). При присваивании переменных атомарного типа копи-
руется значение. Вещественные числа типа float в Python реализо-
ваны с двойной точностью, аналогично числам типа double в язы-
ке C. Переменные типа bool принимают всего два значения: True
(истина) и False (ложь).
Структурные типы данных: списки (в частности, строки str),
кортежи (англ., tuple), словари, классы, функции и т. д. При при-
сваивании переменных структурных типов копируется указатель
на объект.
Особенностью Python является динамическая типизация — пе-
ременная связывается с типом в момент присваивания значения,
а не в момент объявления переменной. В таком подходе нет необхо-
димости явно объявлять тип переменной до того, как ей будет при-
своено какое-либо значение. Например, команда в консоли IPython
In [1]: a = 20

13
Глава 1. Основы программирования на языке Python

создаёт переменную а и присваивает ей целое значение 20. В про-


цессе дальнейшей работы в интерактивном режиме переменная a
трактуется как целое число (число типа int). Информация о типе
хранится вместе со значением и доступна во время исполнения. На-
пример, тип переменной можно узнать с помощь команды type()
In [2]: type(a)
Out [2]: int

Присвоим в интерактивном режиме той же переменной стро-


ковое значение:
In [3]: a = "a string"
In [4]: type(a)
Out [4]: str

Затем запишем в переменную а вещественное число:


In [5]: a = 32.5
In [6]: type(a)
Out [6]: float

или комплексное число:


In [7]: a = 1.5 + 0.5j
In [8]: type(a)
Out [8]: complex

Мнимая часть комплексного числа в Python указывается с по-


мощью буквы j.
Язык Python использует принципы объектно-ориентирован-
ного программирования (ООП). В указанной парадигме про-
граммирования данные и методы для работы с ними объединя-
ются внут­ри одной сущности — так называемого объекта. Класс
в ООП — это тип, описывающий устройство и поведение объектов.
Объект — это конкретный экземпляр класса.
Все сущности в Python являются объектами — и числа, и стро-
ки, и операции, и т. д. Обращение к свойствам (методам и полям)
объектов осуществляется через знак точка (.) после имени соответ-
ствующего объекта.
Например, все переменные типа complex — которые также явля-
ются объектами — имеют поля real и imag , содержащие соответ-

14
1.4. Типы данных

ственно действительную и мнимую части комплексного числа.


Для комплексных чисел реализован метод conjugate(), вычисляю-
щий число, комплексно сопряжённое к данному. Для переменной
а, введённой в команде 6 (см. выше):
In [9]: [Link]
Out [9]: 1.5
In [10]: [Link]
Out [10]: 0.5
In [11]: [Link]()
Out [11]: 1.5-0.5j

Рассмотрим некоторые структурные типы данных в Python.

Строки
Строки — это наборы символов. Для записи строк в Python ис-
пользуются как символы апострофа, так и кавычки:
‘label’, “label”
Это сделано для того, чтобы можно было использовать внутри
строк символы кавычек или апострофов, например: ‘ letter “A” ’
или “ letter ‘A’ ”.
В интерпретаторе Python начиная с версии 3 все строки хранят-
ся в кодировке Unicode. Это позволяет, например, использовать
в строках символы кириллицы.

Списки
Список — упорядоченная последовательность элементов, прону-
мерованных с 0. Элементы списка перечисляются в квадратных
скобках через запятую и могут иметь разные типы. Например, соз-
дадим в интерактивной оболочке IPython список с именем my_list,
состоящий из трёх элементов, первый из которых целое число 1,
второй — символ s, третий — число с плавающей точкой 3.14:
In [1]: my_list = [1, ‘s’, 3.14]

Обращение к элементу списка осуществляется с помощью указа-


ния номера искомого элемента в квадратных скобках после имени
списка:

15
Глава 1. Основы программирования на языке Python

In [2]: my_list[0]
Out [2]: 1
In [3]: my_list[1]
Out [3]: ‘s’

Функция len(<список>) из стандартной библиотеки Python воз-


вращает длину (количество элементов) списка <список>:
In [4]: len(my_list)
Out [4]: 3

Одной из наиболее распространённых операций со списками


является их объединение — конкатенация. В Python это осущест-
вляется с помощью оператора сложения +. Например, создадим
в интерактивном режиме списки А и B, а затем выполним их объ-
единение:
In [5]: A = [1, 2, 3]
In [6]: B = [2, 3]
In [7]: C = A + B
In [8]: C
Out [8]: [1, 2, 3, 2, 3]

Приведём некоторые полезные операции для со списками. Все


операции реализованы как методы класса «список».

•• Добавление элемента в конец списка — метод append(<v>),


где <v> — значение добавляемого элемента. Например, добавим
в конец списка my_list, созданного в команде 1 (см. выше), целое
число 2 и выведем список на экран:
In [9]: my_list.append(2)
In [10]: my_list
Out [10]: [1, ‘s’, 3.14, 2]

•• Удаление последнего элемента из списка — метод pop().


Значение удаляемого элемента выводится на экран. Например,
удалим из списка my_list последний элемент и выведем список
на экран:

16
1.4. Типы данных

In [11]: my_list.pop()
Out [11]: 2
In [12]: my_list
Out [12]: [1, ‘s’, 3.14]

Удаление элемента с индексом index осуществляется методом


pop(index).

•• Перестановка элементов в обратном порядке — метод


reverse(). В применении к списку my_list, созданному выше:
In [13]: my_list.reverse()
In [14]: my_list
Out [14]: [3.14, ‘s’, 1]
П р и м е ч а н и е. Строки являются неизменяемыми списка-
ми символов, поэтому к ним можно применять операции,
реализованные для списков, но не изменяющие список. На-
пример, операция взятия элемента по индексу (квадрат-
ные скобки) позволяет обращаться к конкретному символу
из строки:
In [15]: a = "a string"
In [16]: s[0]
Out [16]: ‘a’
In [17]: s[2]
Out [17]: ‘s’

Кортежи
Кортеж — это неизменяемый список. Кортежи объявляются так
же, как списки, только с использованием круглых скобок. Напри-
мер, объявим в окне интерактивной оболочки кортеж my_tuple
из трёх элементов:
In [1]: my_tuple = (1, ‘s’, 3.14)

Обращение к элементам кортежа осуществляется так же, как


обращение к элементам списка: через указание индекса искомого
элемента в квадратных скобках,

17
Глава 1. Основы программирования на языке Python

In [2]: my_tuple[0]
Out [2]: 1
In [3]: my_tuple[1]
Out [3]: ‘s’

Для кортежей определены все операции, указанные для спис­


ков, но не изменяющие список.
П р и м е ч а н и е. Удобство использования кортежей заклю-
чается в том, что их невозможно случайно изменить. Кроме
того, кортежи занимают в оперативной памяти меньше мес­
та, чем списки той же длины.
Приведём пример создания кортежа с именем my_smallest_tuple,
состоящего из одного элемента:
In [4]: my_smallest_tuple = (1,)

Использование запятой после первого и единственного в рас-


сматриваемом примере элемента обязательно:
In [5]: my_smallest_tuple
Out [5]: (1,)

Словари
Словарь — это неупорядоченный набор объектов, записанных
в виде пары «ключ: значение». Словари аналогичны базе данных,
в которой чтение или запись значения некоторого объекта осу-
ществляется не по его порядковому номеру в списке, а по уни-
кальному идентификатору объекта — ключу. Ключи и значения
в Python могут быть объектами любых типов. Начиная с интер-
претатора Python версии 3.6 гарантируется, что элементы словаря
перебираются в порядке их добавления.
Словари в Python записываются с использованием фигурных
скобок, внутри которых через запятую перечисляются пары
«ключ: значение». Например, создадим в интерактивном режиме
словарь student_dict, состоящий из двух записей об имени и возрас-
те студента:
In [1]: student_dict = {‘name’: ‘Tom’, ‘age’: 20.0}

18
1.4. Типы данных

В данном словаре строки ‘name’ (имя) и ‘age’ (возраст) являются


ключами, а строка ‘Tom’ и число 20.0 — соответствующими значе-
ниями. Конструкция вида
d = [Link]([list], default_value)

где [list] — некоторый список, default_value — некоторое значение,


создаёт словарь d, в котором значения ключей установлены в соот-
ветствии со значениям элементов списка [list], а в качестве значе-
ния всех записей по умолчанию используется default_value.
Доступ к значениям конкретной записи в словаре осуществляет-
ся либо с помощью метода get(<имя ключа>), либо с помощью квад­
ратных скобок после имени словаря с указанием имени ключа:
In [2]: student_dict[‘name’]
Out [2]: ‘Tom’
In [3]: student_dict[‘age’]
Out [3]: 20.0
In [4]: student_dict.get(‘age’)
Out [4]: 20.0

Аналогично осуществляется запись в словарь:


In [5]: student_dict[‘age’] = 18.0
In [6]: student_dict
Out [6]: {‘name’: Tom, ‘age’: 18.0}
Если запись с указанным ключом в словаре уже существует,
то соответствующее значение переписывается. Добавление записи
в словарь можно также осуществлять с помощью метода update(),
в котором в качестве аргумента указывается добавляемая запись.
Например, добавим в словарь student_dict запись о том, закончил
ли студент обучение:
In [7]: student_dict.update{‘graduated’: False}
In [8]: student_dict
Out [8]: {‘name’: Tom, ‘age’: 18.0, ‘graduated’: False}
Удаление записи из словаря осуществляется с помощью метода
pop(). При вызове метод pop() возвращает удаляемое значение. На-
пример, удалим запись о возрасте студента из словаря student_dict :

19
Глава 1. Основы программирования на языке Python

In [9]: student_dict.pop(‘age’)
Out [9]: 18.0
In [10]: student_dict
Out [10]: {‘name’: Tom, ‘graduated’: False}

Методы keys() и values() отображают соответственно списки


ключей и значений из словаря.

1.5. Операции и логические операторы

Рассмотрим некоторые наиболее часто используемые в Python


операторы.
•• Операция присваивания переменной значения делается с по-
мощью знака =.
•• Арифметические операции над числами: + (сложение), – (вычи-
тание), / (деление), * (умножение).
П р и м е ч а н и е 1. В применении к спискам оператор + вы-
полняет их конкатенацию (см. параграф 1.4).
П р и м е ч а н и е 2. В предыдущей версии Python (2.7) в при-
менении к целым числам оператор / выполнял операцию
целочисленного деления. В Python 3.6, оператор / выполняет
обычное деление как в применении к числам с плавающей
точкой, так и к целым числам. Выполнение целочисленно-
го деления выполняется оператором //, нахождение остатка
от деления — оператором %.
•• Команда возведения в степень: ** (двойная звёздочка).
•• Команды преобразования типов:
int(a) — преобразование аргумента а к целому числу;
float(a) — преобразование аргумента а к числу с плавающей точ-
кой;
str(a) — преобразование аргумента а к строке.
Оператор проверки равенства: ==. Результатом действия опе-
рации является True, если объекты совпадают, и False — в против-
ном случае. Например, проверим в окне интерактивной оболочки,
равны ли друг другу числа 1 и 1:

20
1.6. Ввод/вывод

In [1]: 1==1
Out [1]: True
•• Оператор in — проверка, содержится ли объект в списке, кор-
теже или словаре. Например, создадим список my_list и проверим,
входит ли в него символ ‘s’:
In [2]: my_list = [1, ‘s’, 3.14]
In [3]: ‘s’ in my_list
Out [3]: True
Логические операторы переменных типа bool: and (логическое И),
or (логическое ИЛИ).

1.6. Ввод/вывод

Для вывода значений переменных на экран используется встро-


енная функция print(). Если передать в функцию print() несколь-
ко аргументов, разделённых запятыми, то она выведет на экран
в строке последовательно значения всех аргументов, разделён-
ные пробелами. Например, создадим переменные r и m и выведем
на экран их значения:
In [1]: r=1.2
In [2]: m=10
In [3]: print("radius =", r, "[cm], mass =", m, "kg")
radius = 1.2 [cm], mass = 10 [kg]
Для ввода данных с клавиатуры используется функция input()
из стандартной библиотеки Python. После срабатывания коман-
ды input() поток выполнения программы останавливается в ожи-
дании данных, которые пользователь должен ввести с помощью
клавиатуры. После ввода данных и нажатия Enter, функция input()
завершает своё выполнение и возвращает результат, который
представляет собой строку символов, введённых пользователем:
In [4]: x = input()
10

21
Глава 1. Основы программирования на языке Python

In [5]: x
Out [5]: ‘10’
Функция input() может принимать в качестве аргумента строку,
которая будет выведена на экран прежде, чем пользователь нач-
нёт вводить данные с клавиатуры:
In [4]: x = input("Hello! Enter a number. ")
Hello! Enter a number. 10
In [5]: x
Out [5]: ‘10’
Форматированный ввод-вывод данных в Python осуществляет-
ся в стиле языка программирования C. Оператор % используется
для форматирования набора переменных, заключённых в кортеж,
вместе со строкой форматирования, которая содержит обычный
текст вместе со спецификаторами формата — специальными сим-
волами, такими как %s и др., которые указывают тип и правила
форматирования соответствующих переменных. Основные специ­
фикаторы формата:
%s — строка;
%d — целое число;
%f — число с плавающей точкой (по умолчанию отображается
с шестью значащими цифрами после запятой);
%.<N>f — число с плавающей точкой с фиксированным числом
N значащих цифр после запятой;
%e — число с плавающей точкой, записанное в научном форма-
те (пр., число записывается как 6.673e-8; по умолчанию отобража-
ется с шестью значащими цифрами после запятой).
Например:
In [6]: name = "Tom"
In [7]: age = 20
In [8]: print("My name is %s, and I am %d years old" % (name, age))
My name is Tom, and I am 20 years old
In [9]: pi = 3.1415926535
In [10]: print("I know that the Pi number equals %f" % pi)
I know that the Pi number equals 3.141593
In [11]: print("More precisely, Pi number equals %.8f" % pi)

22
1.7. Управляемые блоки кода в Python

More precisely, Pi number equals 3.14159265


In [12]: G = 6.67259e-8
In [13]: print("The gravitational constant equals %.3e" % G)
The gravitational constant equals 6.673e-08

1.7. Управляемые блоки кода в Python


Рассмотрим реализацию управляющих конструкций для бло-
ков кода в Python.
Важной особенностью Python является то, что блоки кода выде-
ляются с помощью отступов, а не фигурными скобками, как в Си,
или операторами begin-end как в Pascal.
Вход в управляемый блок кода указывается с помощью зна-
ка двоеточие (:). После этого каждая строка кода, которая входит
в управляемый блок, должна быть выделена с помощью отступа.
IPython автоматически создаёт отступ после того, как пользова-
тель напечатает знак двоеточие (:) и нажмёт клавишу Enter. Что-
бы убрать отступ, воспользуйтесь клавишей Backspace. Для выхо-
да из управляемого блока необходимо дважды нажать клавишу
Enter. Аналогично осуществляется работа с отступами в текстовом
редакторе, встроенном в IDE Spyder.

Условный оператор if
Данный оператор сообщает интерпретатору, что некоторый
блок кода необходимо выполнять только при определённом усло-
вии. Синтаксис конструкции:
if <условие 1>:
<блок операторов 1>
elif <условие 2>:
<блок операторов 2>

elif <условие i>:
<блок операторов i>

23
Глава 1. Основы программирования на языке Python


elif <условие n-1>:
<блок операторов n-1>

else:
<блок операторов n>

где <условие 1>, <условие 2> и т. д. — любые логические выражения.


Зарезервированное слово elif является сокращением от else if и по-
зволяет проверять дополнительное <условие i>, если не выполнено
<условие i-1>, и выполнять соответствующий <блок операторов i>
(здесь i — номер блока). Количество блоков кода, управляемых elif,
не ограничено. Каждая строка в каждом блоке операторов, следу-
ющем после if, или elif, или else, должна быть выделена с помощью
отступа. Если не выполнено ни одно из условий вплоть до условия
<условие n-1>, то выполняется блок кода <блок операторов n>, ука-
занный после команды else (здесь n — полное число блоков опера-
торов). В конце каждой из строк, начинающихся со слов if, elif, else,
должно стоять двоеточие.
Например, ниже в окне интерактивной оболочки IPython пере-
менной x присваивается целочисленное значение 1, а затем созда-
ётся конструкция, проверяющая, является ли число x положитель-
ным, нулевым или отрицательным, и выводящая соответствую-
щее сообщение на экран:
In [1]: x = 1
In [2]: if x < 0:
…: print ("x is negative")
…: elif x == 0:
…: print ("x is zero")
…: else:
…: print ("x is positive")
x is positive

24
1.7. Управляемые блоки кода в Python

Оператор цикла for


Оператор цикла позволяет выполнять блок некоторых опера-
ций заданное число раз. Чаще всего используется перебор значе-
ний переменной цикла из заранее заданного списка значений.
Синтаксис конструкции:
for <переменная цикла> in [список значений]:
<блок операторов>

где <переменная цикла> — переменная, хранящая текущее значе-


ние из списка [список значений], <блок операторов> — блок операто-
ров, выполняемый столько раз, сколько элементов в списке [спи-
сок значений]. Каждая строка в блоке кода внутри конструкции for
должна быть выделена с помощью отступа. Например, в примере
ниже с помощью цикла for перебираются и выводятся на экран
значения элементов списка my_list :
In [1]: my_list = [0, 1, 2, 3]
In [2]: for i in my_list:
…: print (“i = ”, i)
…:
i = 0
i = 1
i = 2
i = 3

Для перебора значений целочисленного индекса в диапазоне


от 0 до n-1 удобно использовать функцию range (n) из стандарт-
ной библиотеки Python. Эта функция создаёт список из n элемен-
тов множества целых чисел начиная с нуля. Например, создадим
с помощью команды range() цикл, последовательно выводящий
на экран значения чисел 0, 1, 2, 3:
In [3]: for i in range(4):
…: print ("i = ", i)
…:
i = 0
i = 1
i = 2
i = 3

25
Глава 1. Основы программирования на языке Python

Перебор значений переменной цикла можно осуществлять с по-


мощью любой последовательности (строки, списка, словаря, строк
в файле и т. п.). Например, в качестве множества значений пере-
менной цикла можно использовать строку:
In [4]: text = "today is a good day"
In [5]: words_list = [Link]()
In [6]: words_list
Out [6]: ["today", "is", "a", "good", "day"]
In [7]: for word in word_list:
…: print(word)
…:
today
is
a
good
day

В данном примере использован метод split() объектов строково-


го типа. Данный метод разбивает строку на части, используя раз-
делитель, и возвращает эти части списком. По умолчанию счита-
ется, что разделителем является пробельный символ.

Оператор цикла while


Данная управляющая конструкция позволяет выполнять неко-
торый блок кода до тех пор, пока является истинным некоторое за-
данное условие. Конструкция вида
while <условие>:
<блок операторов>

выполняет <блок операторов> до тех пор, пока истинно заданное


<условие>. Каждая строка в блоке кода внутри конструкции while
должна быть выделена с помощью отступа. В следующем приме-
ре значения переменной x последовательно уменьшаются на 1
и выводятся на экран до тех пор, пока x остаётся положительным
числом:

26
1.8. Функции

In [1]: x=2
In [2]: while x > 0:
…: print ("x=", x)
…: x = x - 1

x=2
x=1

1.8. Функции
Функции в программировании нужны для повторного исполь-
зования некоторого блока кода. Синтаксис объявления функции
в Python:
def <имя функции>(<список формальных аргументов>):
<блок операторов>
return <результат>
Объявление функции начинается с зарезервированного сло-
ва def. После него указывается имя функции <имя функции>. Фор-
мальные аргументы функции перечисляются в круглых скобках
после её имени. После скобок ставится знак двоеточия. Тело функ-
ции может состоять из произвольного числа строк кода, каждая
из которых выделяется с помощью отступа. В конце функции мо-
жет располагаться оператор return с последующим указанием
значения <результат>, которое будет возвращать функция при её
вызове. Если в теле функции отсутствует строка, начинающаяся
с return, то при вызове такая функция возвращает значение None
(нулевой указатель).
Строка документации, описывающая то, как работает функция,
оформляется с помощью тройных кавычек.
Вызов функции осуществляется указанием её имени со списком
фактических аргументов в круглых скобках.
Например, определим функцию my_pow(arg1, arg2), принимаю-
щую два аргумента, arg1 и arg2, и вычисляющую сумму квадратов
этих аргументов:

27
Глава 1. Основы программирования на языке Python

In [1]: def my_pow(arg1, arg2):


…: """ сумма квадратов аргументов """
…: tmp = arg1**2 + arg2**2
…: return tmp
…:
In [2]: my_pow(2, 2)
Out [2]: 8
In [3]: my_pow?
Signature: my_pow(arg1, arg2)
Docstring: calculates arg1^arg2
File: c:\path\<ipython-input-36-5b9e115c0c78>
Type: function

Примечания
1. Все переменные, объявленные внутри функции, являются ло-
кальными.
2. Тип формальных аргументов функции определяется исходя
из типа фактических аргументов. При этом команды для работы
с формальными аргументами в теле функции не должны проти-
воречить подразумеваемому типу предполагаемых фактических
аргументов.
Например, создадим функцию
In [4]: def f1(x):
…: return x

Подразумевается, что функция возвращает тот же объект, что


принимает в качестве аргумента. В таком случае в качестве фак-
тического аргумента в функцию f1 можно передавать объект лю-
бого типа, будь то число, строка, список, массив и т. п. Например,
для определённой выше функции
In [5]: f1(1)
Out [5]: 1
In [6]: f1(‘a’)
Out [6]: ‘a’
In [7]: f1([0, 1, ‘b’])
Out [7]: [0, 1, ‘b’]

28
1.8. Функции

Рассмотрим другой пример:


In [8]: def f2(x):
…: result1 = x[0]
…: result2 = x[1]
…: return [result1, result2]
Реализация функции f2 подразумевает, что функция принима-
ет в качестве аргумента объекты, к которым можно применять
оператор [index] (получение элемента по индексу index). Такими
объектами могут быть либо список, либо массив. Рассмотренное
объявление функции запрещает передачу функции в качестве ар-
гумента чисел типа int , float , complex , поскольку к переменным
указанных типов невозможно применить операцию [], использо-
ванную в реализации функции. В таком случае интерпретатор со-
общит об ошибке:
In [9]: f2(1)
Traceback (most recent call last):
File “<ipython-input-12-e94ca8346097>”, line 1, in <module>
f3(1)

File “<ipython-input-8-ff221084ea08>”, line 2, in f3


return [x[0], x[1]]
TypeError: ‘int’ object has no attribute ‘__getitem__’

В рассматриваемом примере продемонстрирована ещё одна


удобная возможность функций в Python — они могут возвращать
не одно значение, а целый список значений. В примере функция f2
возвращает не одно значение, а список из двух значений, x[0] и x[1]
(которые для наглядности обозначены внутри функции как result1
и result2). Пример использования функции f2 после того, как она
была объявлена в окне интерактивной оболочки:
In [10]: f2([1, ‘b’])
Out [10]: [1, ‘b’]

Кроме того, в функцию f2 можно передать список из более чем


двух элементов. В таком случае использованы будут только пер-
вые два элемента списка.

29
Глава 1. Основы программирования на языке Python

1.9. Работа с библиотеками

Существует несколько альтернативных способов подключения


внешних библиотек (модулей) в Python. Рассмотрим эти способы
на примере математической библиотеки math. Данная библиоте-
ка содержит математические функции и константы, такие как:
fabs(x) — модуль числа x; exp(x) — экспонента в степени x; log(x, n) —
логарифм числа x по основанию n; pow( x, y) — возведение числа x
в степень y; sqrt( x) — квадратный корень из числа x ; cos( x), sin( x),
tan(x) — косинус, синус и тангенс числа x в радианах соответствен-
но; pi — число Пи; e — экспонента, и др. Описание полного спис­
ка функций библиотеки можно получить с помощью команды
help(«math») в консоли.
1. Подключение библиотеки осуществляется с помощью коман-
ды import. Например, подключение стандартной библиотеки ма-
тематических функций math:
In [1]: import math

В этом случае все функции из библиотеки math загружаются


в текущее пространство имён интерпретатора так, что пользова-
тель может получить доступ к каждой функции через префикс
math. Например, применим функцию вычисления квадратного
корня sqrt() из библиотеки math:
In [2]: a = [Link](4)
In [3]: a
Out [3]: 2.0
2. Загрузка всех функций из некоторой библиотеки в текущее
пространство имён интерпретатора делается с помощью знака
звёздочка:
In [4]: from math import *

В этом случае все функции из библиотеки math доступны без


префикса. Например, найдём е2 и sin π:
In [5]: b = exp(2)
In [6]: b
Out [6]: 7.3890560989306504

30
1.9. Работа с библиотеками

In [7]: sin(pi)
Out [7]: 0
3. Загрузка в текущее пространство имён конкретных функций
из заданной библиотеки:
In [8]: from math import log10, fact

В рассмотренном примере, из библиотеки math загружаются


только функции log10 (десятичный логарифм) и fact (факториал).
Загруженные функции можно использовать без префикса math.
Например:
In [9]: c = log10(10)
In [10]: c
Out [10]: 1.0
In [11]: factorial(5)
Out [11]: 120

4. Подключение библиотеки с псевдонимом.


Использование второго способа подключения библиотек ка-
жется наиболее удобным, поскольку избавляет от необходимости
писать префиксы функций. Однако при подключении таким спо-
собом нескольких библиотек может возникнуть конфликт имён,
если в разных библиотеках имеются функции с одинаковым име-
нем. Чтобы избежать конфликтов имён и сократить время написа-
ния префиксов в Python, реализована возможность подключения
библиотеки с псевдонимом. Общий синтаксис конструкции
import <library> as <alias>

где <library> — название подключаемой библиотеки, <alias> —


псевдоним, под которым предполагается использовать библиоте-
ку в программе. В примере ниже библиотека math подключается
с псевдонимом m:
In [12]: import math as m

Имя-псевдоним выбирается пользователем самостоятельно.


В дальнейшем обращение к функциям библиотеки math осущест-
вляется с помощью префикса-псевдонима, а не полного имени биб­
лиотеки:

31
Глава 1. Основы программирования на языке Python

In [13]: a = [Link](4)
In [14]: a
Out [14]: 2.0
In [15]: b = [Link](2)
In [16]: b
Out [16]: 7.3890560989306504
In [17]: [Link]([Link])
Out [17]: 0

1.10. Написание файлов исходного кода

Работа с Python в интерактивной оболочке удобна, так как по-


зволяет быстро выполнить какую-либо операцию, протестиро-
вать небольшой блок кода и пр. В случае когда код требуется сохра-
нить для дальнейшего использования, подготавливаются файлы
исходного кода, которые затем передаются интерпретатору на ис-
полнение.
Файлы исходного кода на языке Python имеют расширение .py.
Такие файлы называют скриптами. Скрипт — файл, содержащий
последовательность инструкций, повторяющуюся каждый раз,
когда файл вызывается в интерпретаторе.
Нет никаких специальных требований к оформлению фай-
лов исходного кода на Python. Достаточно перечислить в скрипте
строчка за строчкой команды на синтаксисе Python.
Комментарий в текстовом редакторе начинается со знака ре-
шётки:
# комментарий

При создании нового файла текстовый редактор в IDE Spyder ав-


томатически добавляет шапку-документацию с краткой информа-
цией о файле. Шапка выделяется с помощью тройных кавычек, ко-
торые позволяют записывать строковые переменные в несколько
строчек кода. В шапке указываются используемая кодировка и об-
щая информация о файле:

32
1.10. Написание файлов исходного кода

# -*- coding: utf-8 -*-


"""
Created on Mon Oct 1 20:00:00 2018

@author: Sergey A. Khaibrakhmanov


"""

При необходимости изменить кодировку файла соответству-


ющий комментарий (как в примере выше) обязательно пишется
в самой первой строке файла исходного кода.
Создадим в папке “Z:\” файл [Link], содержащий следующий
код:
# -*- coding: utf-8 -*-
"""
Created on Mon Oct 1 20:00:00 2018

@author: Sergey A. Khaibrakhmanov


"""
# подключение математической библиотеки
import math as m
def distance(x, y):
"""
Функция возвращает сумму квадратов двух
аргументов, которые она принимает. Внутри функции
выполняется преобразование аргументов к типу
float.
"""
return [Link](float(x)**2 + float(y)**2)

# приветствие
print("Hello!")

# считывание значения координаты х с клавиатуры в


# переменную - строку str_x
str_x = input("Enter x-coordinate. ")

33
Глава 1. Основы программирования на языке Python

# считывание значения координаты y с клавиатуры в


# переменную - строку str_y
str_y = input("Enter y-coordinate. ")

# вывод значения расстояния до точки (х, y) на экран


print("The distance is", distance(str_x, str_y))

Запуск файлов в окне интерактивной оболочки IPython осу-


ществляется с помощью команды run с последующим указани-
ем в скобках имени скрипта. В первую очередь в интерактивной
оболочке нужно перейти в папку, где находится файл программы,
с помощью команды cd (change directory):
In [1]: cd "Z:\"
Out [1]: ‘Z:\\’
In [2]: run [Link]
Hello!

Enter x-coordinate. 3

Enter y-coordinate. 4
The distance is 5.0
Другой способ — запустить скрипт командой runfile, указав в ка-
честве аргумента строку-путь к файлу. Например, если скрипт
[Link] расположен в корне диска Z , то нужно написать
In [3]: runfile(‘Z:/[Link]’)

Если вы работаете в среде разработки Spyder, то текущее окно


интерактивной оболочки IPython, как правило, связано с тексто-
вым редактором. Запуск программы в текущей консоли осущест-
вляется нажатием клавиши F5.
Если файлы исходного кода Python ассоциированы в проводни-
ке Windows с установленным интерпретатором Python, то запуск
скриптов из проводника осуществляется двойным щелчком.
Для запуска скрипта Python из командной строки Windows или
консоли Linux необходимо перейти в командной строке (консоли)
в папку, где хранится скрипт, напечатать имя скрипта и нажать
клавишу Enter.

34
1.11. Создание и использование собственных модулей

1.11. Создание и использование собственных модулей

Пользовательские файлы исходного кода Python могут быть


использованы как модули, подключаемые к другой программе
на Python. Загрузка объектов (данных и функций) из внешнего мо-
дуля осуществляется так же, как в случае любых сторонних биб­
лиотек и модулей Python: с помощью команд import , описанных
в параграфе 1.9.
Например, создадим файл-модуль convert_distance.py, в котором
определены значения астрономической единицы (1 а.е. = 1,5 ·1013 см)
и парсека (1 пк = 3,086 ·1018 см), а также функции для преобразова-
ния расстояния из сантиметров в а.е. и пк:
# -*- coding: utf-8 -*-
"""
Created on Mon Oct 1 20:00:00 2018
Модуль содержит константы и функции для преобразования рассто-
яний к единицам измерения, принятым в астрофизике
@author: С.А. Хайбрахманов
"""
# астрономическая единица в см
au = 1.5e13
# парсек в см
pc = 3.086e18

def cm2au(dist_cm):
"""
Функция преобразования расстояния, измеренного в см,
в астрономические единицы
"""
return dist_cm / au

def cm2pc(dist_cm):
"""
Функция преобразования расстояния, измеренного в см,
в парсеки
"""
return dist_cm / pc

35
Глава 1. Основы программирования на языке Python

Допустим, модуль convert_distances.py сохранён в папке G:/


python_modules/. Ниже приведён листинг программы test_distance_
[Link], в которой подключается и используется модуль convert_
[Link]. В программе сначала подключается модуль sys, содер-
жащий определение списка path — списка имён папок, в которых
интерпретатор Python выполняет поиск подключаемых моду-
лей. В список path с помощью метода append() добавляется строка
с именем папки, в которой сохранён модуль c ­ onvert_­distances.­py.
Затем программа предлагает пользователю ввести расстояние
в см и последовательно использует определённые в модуле функ-
ции и переменные:
# -*- coding: utf-8 -*-
"""
Created on Fri Oct 11 14:16:51 2019

Тестирование модуля преобразования расстояний


@author: С.А. Хайбрахманов
"""
# подключение модуля sys для взаимодействия
# с интерпретатором python
import sys
# добавление в список path из модуля sys
# строки с именем папки (G:/), в которой
# расположен пользовательский модуль
[Link]("G:/")

# подключение пользовательского модуля


# с псевдонимом convert
import convert_distance as convert

print("Привет!")
dist = float(input("Введите расстояние в см:\n r = "))
print("Результат преобразования:")
print(" r = %.2e а.е." % convert.cm2au(dist))
print(" r = %.2e пк" % convert.cm2pc(dist))
print(" где 1 а.е. = %.2e см" % [Link])
print(" где 1 пк = %.2e см" % [Link])

36
Примеры решения задач

Примеры решения задач

Задача 1. Создайте в окне интерактивной оболочки IPython


функцию, выполняющую деление двух чисел.
Решение. Создадим функцию my_division, принимающую два ар-
гумента, arg1 и arg2 (см. вставку кода ниже). С помощью управля-
ющей конструкции if-else реализуем проверку того, не является
ли второй аргумент нулём. Если нет, то функция возвращает ре-
зультат деления arg1/arg2, если да — выводит сообщение об ошибке
«division by zero!».
In [1]: def my_division(arg1, arg2):
…: if arg2 != 0:
…: return arg1 / arg2
…: else:
…: print ("division by zero!")
…:

Проверим работоспособность функции:


In [2]: my_division(2, 2)
Out [2]: 1.0
In [3]: my_division(3.0, 0)
division by zero!

Задача 2. Напишите программу, которая предлагает пользова-


телю ввести два числа а1 и а2, а затем вычисляет величину

1
.
(a12 + a22 )
Решение. Далее приведён листинг программы. Предложение
пользователю ввести два числа и их считывание реализовано
с помощью функции input() из стандартной библиотеки (см. па-
раграф 1.6). Вычисление квадратного корня осуществляется с по-
мощью функции sqrt() из библиотеки математических функций
math, которая подключается с псевдонимом m (см. параграф 1.9).
Операция вычисления требуемой величины оформлена в виде
функции f(x,y). Внутри функции f выполняется преобразование
аргументов x и y к вещественному типу float.

37
Глава 1. Основы программирования на языке Python

# -*- coding: utf-8 -*-


"""
Задача 2
"""
import math as m

def f(x, y):


return 1 / [Link](float(x)**2 + float(y)**2)

print("Hello!")
str_a1 = input("Enter a1: ")
str_a2 = input("Enter a2: ")
print("The result is", f(str_a1, str_a2))

Задача 3. Напишите программу «телефонный справочник».


Программа предлагает пользователю ввести имя абонента, затем
проверяет, есть ли абонент в заранее подготовленном справочни-
ке. Если имя абонента найдено, то программа выводит на экран
сообщение с соответствующим номером телефона, если нет — со-
общает пользователю, что данный абонент не найден. Справоч-
ник имён и телефонов в программе должен быть реализован с по-
мощью типа ‘список’.
Решение. Далее приведён листинг программы. В программе соз-
даются списки phones_list и names_list, содержащие соответственно
номера телефонов и имена, в строковом формате. Программа выво-
дит на экран приветствие, затем считывает и записывает в пере-
менную str_name введённую пользователем строку. Если введён-
ная строка содержится в списке names_list, то с помощью метода
index(str_name) вычисляется индекс соответствующего элемента
в списке names_list, и затем на экран выводится строка с соответ-
ствующим номером телефона. Если введённого пользователем
имени нет в списке names_list, то программа сообщает, что пользо-
ватель не найден, и завершает работу.
# -*- coding: utf-8 -*-
"""
Задача 3
"""

38
Примеры решения задач

hones_list = [‘7-351-00-00’, ‘7-351-00-01’, ‘7-351-00-02’, ‘7-351-


p
00-03’]
names_list = [‘Ivan’, ‘Kate’, ‘Sergey’, ‘Fox’]

print("Hello!")
str_name = input("name: \n")

if str_name in names_list:
index = names_list.index(str_name)
print(str_name, "phone is", phones_list[index])
else:
print ("user not found")

Задача 4. Модифицируйте программу из задачи 2 так, чтобы она


завершала свою работу по желанию пользователя.
Решение. Далее приведён листинг программы. Основной цикл
выполнения программы реализован с помощью управляющей
конструкции while. Программа выводит на экран приветствие,
просит пользователя ввести два числа, выводит результат вы-
полнения требуемой операции на экран до тех пор, пока значение
логической переменной work истинно. Внутри основного цикла
с помощью конструкции while реализован ещё один цикл, кото-
рый выполняется до тех пор, пока значение логической перемен-
ной ­ask_ ­to_ proceed истинно. Внутри данного цикла программа
выводит запрос о необходимости продолжить работу. Если поль-
зователь вводит ответ y или yes, то логической переменной work
присваивается значение True. Если пользователь ввёл n или no,
то work присваивается значение False. В обоих случаях значение
переменной ask_to_ proceed устанавливается в False для того, чтобы
выйти из данного цикла. Если ответ пользователя не содержит y,
yes, n или no, то исходное значение (True) логической переменной
ask_to_ proceed не меняется и внутренний цикл повторяется.
# -*- coding: utf-8 -*-
"""
Задача 4
"""

39
Глава 1. Основы программирования на языке Python

import math as m

def f(x, y):


return 1 / [Link](float(x)**2 + float(y)**2)

work = True
while work:
print("Hello!")
str_a1 = input("Enter a1: \n")
str_a2 = input("Enter a2: \n")
print("The result is", f(str_a1, str_a2))

ask_to_proceed = True
while ask_to_proceed:
str_ans = input("continue work? \n")
if (str_ans in ["y", "n", "yes", "no"]):
if (str_ans in ["y", "yes"]):
work = True
else:
work = False
ask_to_proceed = False
else:
print ("I didn’t understand your answer.
Please, enter y, n, yes, or no.")

Задания для самостоятельной работы


1. Модифицируйте программу задачи 3 так, чтобы записи в те-
лефонном справочнике были реализованы с помощью словарей,
а не списков. Код, реализованный с помощью словарей, является
более быстрым, чем код, написанный с использованием списков.
2. Напишите программу, реализующую возможности простого
калькулятора. Программа ожидает ввода двух чисел с клавиату-
ры, затем предлагает выбрать требуемую арифметическую опера-

40
Рекомендуемая литература

цию (+, –, /, × ), производит вычисления и выводит результат. Если


результат вычисления равен числу больше 100 или меньше 0.01,
то он должен выводиться на экран в научном формате с тремя зна-
чащими цифрами после запятой. Выход из программы осущест-
вляется по желанию пользователя.

Вопросы для самоконтроля

1. Что такое интерпретатор?


2. В чём заключается интерактивный режим работы с интер-
претатором?
3. Как в интерактивном режиме вывести на экран значение пе-
ременной?
4. Что означает динамическая типизация? Как определить тип
переменной?
5. В чём отличие списка от кортежа?
6. Как в управляющих конструкциях Python выделяются блоки
кода?
7. Что такое скрипт?
8. Как вывести на экран значение переменной в скрипте?
9. В чём отличие одинарных и двойных кавычек при оформле-
нии строк в Python?
10. Как называется библиотека для работы с математически-
ми функциями и константами? Воспользуйтесь функцией help()
и выясните названия функций для вычисления обратных синуса,
косинуса и тангенса, а также гиперболических функций.

Рекомендуемая литература

1. Фёдоров, Д. Ю. Программирование на языке высокого уровня


python : учеб. пособие для сред. профес. образования / Д. Ю. Фёдо-
ров. — 2-е изд. — М. : Юрайт, 2019. — 161 с. (Профессиональное об-
разование). — URL: [Link] (дата
обращения: 15.10.2019).

41
Глава 1. Основы программирования на языке Python

2. Буйначев, С. К. Основы программирования на языке Python


/ С. К. Буйначев, Н. Ю. Боклаг ; Мин-во образования и науки Рос.
Федерации, Урал. федер. ун-т им. первого Президента России
Б. Н. Ельцина. — Екатеринбург : Изд-во Урал. ун-та, 2014. — 92 с.—
URL: [Link] (дата обра-
щения: 15.10.2019).
3. Шелудько, В. М. Основы программирования на языке высоко-
го уровня Python / В. М. Шелудько ; Мин-во науки и высш. обра-
зования РФ, Юж. федер. ун-т, Инженер.-технолог. акад. — Ростов
н/Д. ; Таганрог : Изд-во Юж. федер. ун-та, 2017. — 147 с. — URL: http://
[Link]/[Link]?page=book&id=500056 (дата обращения:
15.10.2019).
4. Читлур, С. Укус Питона [Электронный ресурс] / С. Чит-
лур ; пер. В. Смоляр. — 2013–2019. — URL: [Link]
AByteOfPython/[Link] (дата обращения: 16.10.2019)

42
Глава 2 
Библиотека NumPy для работы
с многомерными массивами

В данной главе описываются базовые возможности библиоте-


ки NumPy для работы с многомерными массивами. Разбираются
примеры создания массивов, доступа к элементам массивов, быст­
рых операций над массивами. В завершение приводится самосто-
ятельное задание по работе с одномерными и двумерными масси-
вами, а также список контрольных вопросов.

2.1. Общие сведения

Библиотека NumPy представляет собой набор инструментов для


научных расчётов. Библиотека содержит описание специального
типа данных ndarray, реализующего возможности многомерных
массивов (массивов произвольной размерности). Кроме того, биб­
лиотека включает в себя функции для работы с многомерными
массивами типа ndarray, а также имеет возможности для реше-
ния задач линейной алгебры, использования преобразования Фу-
рье и работы со случайными числами.
Массив ndarray может содержать последовательности данных
одного типа, таких, например, как:
•• сетка экспериментально измеренных величин (пр., показания
термометра в разные моменты времени);
•• сетка расчётных величин (пр., координаты материальной точ-
ки в заданные моменты времени, полученные с помощью числен-
ного решения уравнения движения);
•• пиксели изображения;
•• прочие.

43
Глава 2. Библиотека NumPy для работы с многомерными массивами

Общепринятый способ подключения библиотеки NumPy:


In [1]: import numpy as np

2.2. Создание массивов NumPy


Существует несколько способов создания массивов с помощью
библиотеки NumPy.

Ручное создание на основе списка Python


Функция array() из библиотеки NumPy принимает в качестве
аргумента список и возвращает массив типа ndarray, содержащий
те же значения, что и указанный список.
Например, создадим одномерный массив чисел от 0 до 4 из зара-
нее определённого списка my_list :
In [1]: my_list = [0, 1, 2, 3, 4]
In [2]: a1 = [Link](my_list)
In [3]: a1
Out [3]: array([ 0, 1, 2, 3, 4])
In [4]: type(a1)
Out [4]: <type ‘[Link]’>

Создадим двумерный массив (матрицу) чисел с плавающей точ-


кой. Матрицу можно представить как список, элементами кото-
рого являются списки чисел — строк матрицы. Чтобы указать ин-
терпретатору тип элементов создаваемого массива, добавим пос­
ле запятой в списке аргументов функции array() аргумент dtype
со значением float,
In [5]: a2 = [Link]([[1, 2, 3], [4, 5, 6]], dtype=float)
In [6]: a2
Out [6]:
array([[ 1., 2., 3.],
[4., 5., 6.]])

44
2.2. Создание массивов NumPy

Создание массива с помощью встроенных функций


из библиотеки NumPy
Функция [Link](start, stop, step) создаёт массив чисел, рас-
пределённых в диапазоне [start, stop) с шагом step. Если аргумен-
ты start и step не указаны, то [Link]() создаёт массив чисел
в диапазоне от 0 до stop-1 с шагом 1. Например, массив из 5 чисел
от 0 до 4:
In [1]: a = [Link](5, dtype=float)
Out [1]: array([ 0., 1., 2., 3., 4.])

В данном примере в функцию [Link]() передан дополни-


тельный аргумент dtype со значением float, указывающий тип чи-
сел в создаваемом массиве. Создадим массив чисел от 11 до 16 с ша-
гом 2:
In [2]: a = [Link](11, 16, 2, dtype=float)
Out [2]: array([ 11., 13., 15.])

Функция [Link](start, stop, n) создаёт массив из n чисел,


распределённых с одинаковым интервалом в диапазоне от start
до stop. Функция также может принимать дополнительный аргу-
мент dtype для указания типа чисел в создаваемом массиве. На-
пример, создадим массив из 6 чисел с плавающей точкой в диа-
пазоне от 0 до 1:
In [3]: a = [Link](0, 1, 6, dtype=float)
Out [3]: array([ 0., 0.2, 0.4, 0.6, 0.8, 1.0])

Массивы, заполненные нулями или единицами


[Link](n) —создаёт массив из n нулей:
In [1]: a = [Link](7, dtype=int)
Out [1]: array([0, 0, 0, 0, 0, 0, 0])

[Link](n) — создаёт массив из n единиц:


In [2]: a = [Link](3, dtype=int)
Out [2]: array([1, 1, 1])

45
Глава 2. Библиотека NumPy для работы с многомерными массивами

2.3. Доступ к элементам массива

Доступ к элементам массива для выполнения операций чте-


ния и присваивания осуществляется так же, как в случае списков
Python, — с помощью указания индекса искомого элемента в квад­
ратных скобках:
In [1]: a1 = [Link]([1, 4, 5, 8])
In [2]: a1[3]
Out [2]: 8.0
In [3]: a1[0] = 5.
In [4]: a1
Out [4]: array([ 5., 4., 5., 8.])

Рассмотрим двумерный массив a2 из n строк и m столбцов.


Данный массив представляет собой матрицу n×m. Будем нумеро-
вать строки массива индексом i (пробегает значения от 0 до n-1),
а столбцы — индексом j (пробегает значения от 0 до m-1). Доступ к
элементам двумерного массива осуществляется с помощью указа-
ния соответственно номеров строки и столбца в квадратных скоб-
ках через запятую. Например, a2[i, j] — это элемент из i-й строки и
j-го столбца. Рассмотрим конкретный пример с массивом из двух
строк и трёх столбцов:
In [5]: a2 = [Link]([[1, 2, 3], [4, 5, 6]], dtype=float)
In [6]: a2[0, 1]
Out [6]: 2.0

Срезы массивов
Мощным и удобным инструментом работы с массивами в биб­
лиотеке NumPy являются так называемые срезы. Общий синтак-
сис среза некоторого одномерного массива a:
a[start:stop:step]

Данная конструкция возвращает подмножество («срез») элемен-


тов из массива a c индексами в диапазоне от start до stop-1 с шагом
по индексу step. Например, создадим массив из 9 чисел в диапазо-
не от 0 до 2:

46
2.3. Доступ к элементам массива

In [1]: a1 = [Link](0, 2, 9)
In [2]: a1
Out [2]: array([ 0.0, 0.25, 0.5, 0.75, 1.0, 1.25, 1.5, 1.75, 2.0])
Выделим из данного массива подмножество, содержащее эле-
менты массива a1 начиная с первого и заканчивая пятым:
In [3]: a1[1:5:1]
Out [3]: array([0.25, 0.5, 0.75, 1.0])

В данном примере start=1, stop=5, step=1.


Любой из компонентов среза (start, stop, step) не обязателен. Напри-
мер, если не указать третий аргумент (step), то будет использовано
его значение по умолчанию (step=1). Для созданного выше массива
при start=1, stop=3 будут возвращены первый и второй элементы:
In [4]: a1[1:3]
Out [4]: array([0.25, 0.5])

Если не указаны первый (start) и/или второй (stop) аргументы, то


будут использованы их значения по умолчанию: 0 для start и array.
size для stop, где [Link] — число элементов в данном массиве. Та-
ким образом, конструкция вида array[::] возвращает все элементы
массива array. В случае когда не указывается ни один из аргумен-
тов (start, stop, stop), один знак двоеточия может быть опущен:
In [5]: a1[::]
Out [5]: array([0.0, 0.25, 0.5, 0.75, 1.0, 1.25, 1.5, 1.75, 2.0])
In [6]: a1[:]
Out [6]: array([0.0, 0.25, 0.5, 0.75, 1.0, 1.25, 1.5, 1.75, 2.0])
Для примера выведем на экран каждый второй элемент масси-
ва a1:
In [7]: a1[::2]
Out [7]: array([0. , 0.5, 1. , 1.5, 2.])

(step=2, start и stop не указаны).


Все элементы массива a1 начиная с 4-го:
In [8]: a1[4:]
Out [8]: array([1. , 1.25, 1.5 , 1.75, 2.])

(указан start=4, stop и step не указаны).

47
Глава 2. Библиотека NumPy для работы с многомерными массивами

Отрицательное значения индексов start и/или stop интерпрети-


руются как значения n + start и/или n + stop соответственно, где
n — число элементов в соответствующем измерении массива. На-
пример:
In [9]: a1[-3::]
Out [9]: array([1.5 , 1.75, 2.])
In [10]: a1[:-3:]
Out [10]: array([0.0, 0.25, 0.5, 0.75, 1.0, 1.25])
Отрицательное значение индекса step соответствует перебору
элементов в выбранном диапазоне в обратном порядке, то есть от
больших индексов к меньшим:
In [11]: a1[::-1]
Out [11]: array([2., 1.75, 1.5, 1.25, 1., 0.75, 0.5, 0.25, 0.])

Аналогичным образом можно применять операции срезов для


любого из измерений многомерных массивов. Общая конструкция
среза для двумерного массива:
a2[start_row:stop_row:step_row, start_column:stop_column:step_
column]

возвращает двумерный массив-срез, содержащий строки исходно-


го массива a2 с номерами от start_row до stop_row-1 с шагом step_
row и столбцы с номерами от start_column до stop_solumn-1 с шагом
step_column. Как и в случае одномерных массивов, любой из трёх
аргументов в каждом из измерений является необязательным. На-
пример, конструкции вида
a2[::, ::]

и
a2[:, :]

возвращают элементы из всех строк и всех столбцов исходного


массива a2, то есть весь массив a2. Конструкция
a2[:, j]

возвращает элементы из всех строк j-го столбца массива а2 (проще


говоря, j-й столбец). Конструкция

48
2.3. Доступ к элементам массива

a2[i, :]

возвращает элементы из всех столбцов i-й строки массива a2,


то есть i-ю строку.
Рассмотрим конкретный пример. Создадим двумерный массив
a2 — матрицу из трёх строк и четырёх столбцов:
In [9]: a2 = [Link]([[-1, 0, 2, 4], [10, 20, 40, 80], [7, 7, 7,
7]])
Out [9]:
array([[-1, 0, 2, 4],
[10, 20, 40, 80],
[7, 7, 7, 7]])
Нулевой столбец массива a2:
In [10]: a2[:, 0]
Out [10]: array([-1, 10, 7])

Первый столбец массива a2:


In [11]: a2[:, 1]
Out [11]: array([0, 20, 7])

Первая строка массива a2:


In [12]: a2[1, :]
Out [12]: array([10, 20, 40, 80])

Вторая строка массива a2:


In [13]: a2[2, :]
Out [13]: array([7, 7, 7, 7])

Срезы можно использовать и в операциях присваивания. На-


пример, создадим одномерный массив new_array, элементы ко-
торого являются суммой соответствующих элементов из первой
и второй строк двумерного массива a2:
In [14]: new_array = a2[1, :] + a2[2, :]
In [15]: new_array
Out [15]: array([17, 27, 47, 87])
Удобство срезов заключается в возможности проведения опе-
раций сразу над некоторой частью массива без необходимости

49
Глава 2. Библиотека NumPy для работы с многомерными массивами

­ вного использования цикла по перебору элементов. Работа со сре-


я
зами оптимизирована так, что она осуществляется быстрее, чем
ручной перебор элементов с помощью циклов for.
З а м е ч а н и е. Для списков Python реализована аналогичная
операция взятия срезов.

2.4. Функции для работы с массивами

Рассмотрим некоторые наиболее распространённые функции


для работы с массивами. Напомним, что все сущности в Python
являются объектами. Массивы NumPy являются объектами клас-
са ndarray. Обращение к методам работы с данным объектом осу-
ществляется через точку.
Сумма элементов массива — метод sum():
In [1]: a = [Link]([2, 4, 3], float)
In [2]: [Link]()
Out [2]: 9.0
Произведение элементов массива — метод prod():
In [3]: [Link]()
Out [3]: 24.0

Среднее арифметическое значение среди элементов массива —


метод mean():
In [4]: [Link]()
Out [4]: 3.0

Минимальный элемент массива — метод min():


In [5]: [Link]()
Out [5]: 2.0

Максимальный элемент массива — метод max():


In [6]: [Link]()
Out [6]: 4.0

50
2.4. Функции для работы с массивами

Индекс минимального элемента массива — метод argmin():


In [7]: [Link]()
Out [7]: 0

Индекс максимального элемента массива — метод argmax():


In [8]: [Link]()
Out [8]: 1

Рассмотрим также некоторые поля объектов типа ndarray. Обра-


щение к полям объектов в Python осуществляется через точку без
круглых скобок после имени поля.
Полное число элементов массива хранится в поле size:
In [9]: [Link]
Out [9]: 3

Размерность массива — поле ndim:


In [10]: [Link]
Out [10]: 1

Количество элементов в каждом из измерений массива содер-


жится в поле shape. Данное поле является кортежем (см. пара-
граф 1.4). Число элементов кортежа соответствует числу измере-
ний. Каждый элемент кортежа — число элементов в данном изме-
рении. Например, для одномерного массива a, состоящего из трёх
элементов:
In [11]: [Link]
Out [11]: (3,)

Для двумерного массива а2, состоящего из двух строк и трёх


столбцов:
In [12]: a2 = [Link]([[0, 1, 2], [10, 20, 101]])
In [13]: [Link]
Out [13]: (2, 3)

51
Глава 2. Библиотека NumPy для работы с многомерными массивами

2.5. Универсальные функции

Универсальные функции представляют собой оболочки для


обычных математических функций, выполняющие обработку
массивов типа ndarray поэлементно. Универсальные функции ре-
ализованы в виде скомпилированного кода на языке C, что обеспе-
чивает быструю скорость выполнения операций.
Например, все арифметические операции, будучи применены
к массиву ndarray целиком (без указания индексов элементов),
применяются поэлементно. Данная процедура выполняется зна-
чительно быстрее, чем если бы операция выполнялась в обычном
цикле for. Например, создадим массивы a и b из трёх чисел и при-
меним к ним арифметические операции:
In [1]: a = [Link]([1,2,3], float)
In [2]: b = [Link]([5,2,6], float)
In [3]: a + b
Out [3]: array([6., 4., 9.])
In [4]: a – b
Out [4]: array([-4., 0., -3.])
In [5]: a * b
Out [5]: array([5., 4., 18.])
In [6]: b / a
Out [6]: array([5., 1., 2.])
Возведение в степень:
In [7]: b**a
Out [7]: array([5., 4., 216.])

Матричное произведение массивов осуществляется с помощью


функции [Link]():
In [8]: a = [Link]([1, 2, 3], float)
In [9]: b = [Link]([0, 1, 1], float)
In [10]: [Link](a, b)
Out [10]: 5.0
Многие стандартные математические функции реализованы
в NumPy в виде универсальных функций. Например, [Link](),

52
2.6. Работа с файлами

[Link](), [Link](), [Link]() и т. д. При передаче массивов


ndarray в универсальные математические функции, определён-
ные в библиотеке NumPy, автоматически создаётся массив с соот-
ветствующими значениями функции от каждого элемента исход-
ного массива. Например:
In [11]: x = [Link](0, 9, 10)
In [12]: x
Out [12]: array([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.])
In [13]: y = [Link](x)
In [14]: y
Out [14]: array([ 0., 0.84147098, 0.90929743, 0.14112001,
-0.7568025, -0.95892427, -0.2794155, 0.6569866 , 0.98935825,
0.41211849])
In [15]: type(y)
Out [15]: [Link]
In [16]: y2 = [Link](x)
In [17]: y2
Out [17]: array([ 0., 1., 1.41421356, 1.73205081, 2.,
2.23606798, 2.44948974, 2.64575131, 2.82842712, 3.])
Таким образом, NumPy позволяет осуществлять быстрые мате-
матические преобразования над массивами целиком без необходи-
мости применения циклов для поэлементной обработки массивов.

2.6. Работа с файлами

Для чтения табулированных данных из текстовых файлов


в биб­л иотеке NumPy реализована функция loadtxt(). Её синтаксис:
[Link](fname, dtype=<type ‘float’>, comments=’#’, delimi
ter=None, skiprows=0, usecols=None)

где
•• fname — строка-имя текстового файла (вместе с путём до него);
•• dtype — тип, к которому необходимо преобразовать считыва-
емые данные;

53
Глава 2. Библиотека NumPy для работы с многомерными массивами

•• comments — символы, которые использованы в текстовом фай-


ле для обозначения комментариев, то есть строк, которые не нуж-
но считывать;
•• delimeter — использованный в файле разделитель между
столбцами. Разделителями по умолчанию считаются пробелы
и знаки табуляции;
•• skiprows — количество строк (начиная с первой), которые не-
обходимо пропустить при считывании файла;
•• usecols — кортеж, содержащий номера столбцов, которые необ-
ходимо считать из файла. Нумерация начинается с 0.
Функция loadtxt() возвращает массив типа ndarray, хранящий
данные из файла, с тем же количеством строк и столбцов.
Для примера рассмотрим текстовый файл [Link], расположен-
ный в корне диска D и содержащий следующую информацию:

#данные расчёта: x, t, v, T
0 0 1 0
1 0.84 0.54 1
2 0.91 –0.42 4
3 0.94 –0.99 9

В файле первая строка является комментарием, сообщающем


о содержимом файла: нулевой столбец — координата x, первый —
время t, второй — скорость v, третий — температура T. Запишем
первые три столбца файла в переменную data:
In [1]: data = [Link](“D:\[Link]”, comments=’#’, usecols=(0,
1, 2))
In [2]: data
Out [2]:
array([[ 0. , 0. , 1. ],
[ 1. , 0.84, 0.54],
[ 2. , 0.91, -0.42],
[ 3. , 0.94, -0.99]])

Выведем на экран значения координаты (нулевой столбец мас-


сива data):

54
Задание для самостоятельной работы

In [3]: data[:, 0]
Out [3]: array([0., 1., 2., 3.])
Выведем на экран значения скорости (второй столбец массива
data):
In [4]: data[:, 2]
Out [4]: array([ 1. , 0.54, -0.42, -0.99])

Для записи массива числовых данных в текстовый файл в би-


блиотеке NumPy имеется функция savetxt() со следующим синтак-
сисом:
[Link](fname, X, fmt=’%.18e’, delimiter=’ ‘)

где
•• fname — строка-имя текстового файла для сохранения данных
(вместе с путём до него);
•• X — одномерный или двумерный массив типа ndarray, кото-
рый требуется сохранить в файл;
•• fmt — формат для сохранения данных (см. описание специфи-
каторов формата в параграфе 1.6);
•• delimeter — строка или символ, который следует использовать
как разделитель между столбцами.
С полным списком аргументов функции savetxt() можно озна-
комиться с помощью функции help([Link]) в консоли или
на сайте библиотеки NumPy.

Задание для самостоятельной работы


Напишите программу, выполняющую следующие операции:
1. Поэлементное сложение двух одномерных массивов, a1 и a2,
заданного размера N. Элементы массива a1: числа, равнораспреде-
лённые в диапазоне от 0 до 100. Элементы массива a2: числа, рав-
нораспределённые в интервале от 0 до 1.
2. Перемножение матриц, m1 и m2, с заданным числом строк
и столбцов. Элементы в каждом столбце матрицы m1: элементы
из массива a1. Элементы в каждой строке матрицы m2: элементы
из массива a2.

55
Глава 2. Библиотека NumPy для работы с многомерными массивами

Все массивы должны иметь тип ndarray. Размеры массивов


и мат­риц произвольны и задаются как параметры. Заполнение
матриц m1 и m2 значениями следует сделать с использованием
операции срезов массивов. Операции 1 и 2 необходимо реализо-
вать двумя способами: непосредственно с помощью циклов for
и используя возможности библиотеки NumPy, позволяющие вы-
полнять операции над массивами целиком. Сравните время вы-
полнения операций 1 и 2, выполненных обоими способами. Вре-
мя выполнения некоторого участка кода можно вычислить, при-
меняя функцию default_timer() из модуля timeit. Данная функция
возвращает время в секундах, прошедшее с момента запуска ин-
терпретатора. Ниже для примера приведён код для выполнения
и анализа времени выполнения операции сложения массива a1,
заполненного нулями, с массивом a2, заполненным единицами.
# загрузка функции-таймера
from timeit import default_timer as timer
# подключение библиотеки numpy
import numpy as np

N=1000 # размер одномерных массивов


# создание массива, заполненного нулями
a1 = [Link]((N))
# создание массива, заполненного единицами
a2 = [Link]((N))
# массив для сохранения результата сложения
result = [Link]((N))

# сложение созданных массивов напрямую в цикле


print(‘a) сложение массивов напрямую в цикле:’)
start = timer() # запуск таймера
for i in range(N):
result[i] = a1[i] + a2[i]

56
Рекомендуемая литература

end = timer() # остановка таймера


print(u’ время выполнения: %.3e с’ % (end - start))

# быстрое сложение
print(‘б) сложение с помощью numpy:’)
start = timer() # запуск таймера
result = a1 + a2
end = timer() # остановка таймера
print(‘ время выполнения: %.3e с’ % (end - start))

Вопросы для самоконтроля


1. Объясните, в чём отличие функций arange() и linspace()?
2. Что такое срез массива?
3. Допустим, m — это двумерный массив. Что означают кон-
струкции m[:, j] и m[i, :]?
4. Что означают отрицательные индексы в срезах массивов?
5. Как быстро определить номера минимальных и максималь-
ных элементов в данном массиве?
6. Что такое универсальные функции?

Рекомендуемая литература

1. Нуньес-Иглесиас, Х. Элегантный SciPy / Х. Нуньес-Иглесиас,


Ш. ван дер Уолт, Х. Дэшноу. — М. : ДМК Пресс, 2018. — 266 с.
2. The SciPy community. NumPy quickstart tutorial [Электронный
ресурс] / The SciPy community. — 2008–2019. — URL: [Link]
org/devdocs/user/[Link] (дата обращения: 16.10.2019)

57
Глава 3 
Библиотека визуализации
Matplotlib

В данной главе описываются базовые возможности библиотеки


Matplotlib, предназначенной для визуализации данных. Разбира-
ются примеры по рисованию графиков с параметрами по умолча-
нию, создания рисунков с настраиваемыми параметрами, рисо-
вания графиков по данным из текстовых файлов, рисования дву-
мерных распределений, а также добавления на рисунки подписей
с математическими символами. В завершение приводится зада-
ние для самостоятельного написания программы создания рисун-
ка с заданным параметрами, а также вопросы для самоконтроля.

3.1. Общие сведения

Библиотека Matplotlib предназначена для создания двумерной


и трёхмерной графики. В качестве основного типа данных исполь-
зуются массивы типа ndarray, определённые в библиотеке NumPy.
Имеются функции для рисования графиков в прямоугольных и по-
лярных координатах, диаграмм рассеяния (англ., scatter plot), гра-
фиков с указанием величин ошибок (англ., errorbar), гистограмм,
круговых и столбчатых диаграмм (англ., pie chart и bar chart), дву-
мерных распределений скалярных и векторных величин и т. д.
Высокое качество получаемых изображений позволяет исполь-
зовать их в научных публикациях. Библиотека может использо-
ваться в скриптах Python, в интерактивной оболочке IPython, веб-
приложениях, графическом интерфейсе пользователя.
Библиотека имеет иерархическую структуру и использует
принципы объектно-ориентированного программирования. Ба-
зовые функции для создания графиков расположены в модуле

58
3.2. Создание простого рисунка с параметрами по умолчанию

[Link]. Данный модуль позволяет создавать графику


в стиле команд MATLAB.

3.2. С оздание простого рисунка


с параметрами по умолчанию

Рассмотрим простейший пример рисования графика с помощью


функций модуля pyplot. Общепринятым способом подключения
данного модуля является команда
import [Link] as plt

то есть модуль подключается с псевдонимом plt.


Создадим скрипт для рисования простого рисунка — графика
зависимости y = sin x. Для отображения набора пар значений x и y
используется функция plot() из модуля [Link]. Синтаксис
вызова функции:
[Link](x, y, args)

где x — массив значений, отображаемых по оси абсцисс (массив


координат), y — массив значений, откладываемых по оси ординат
(массив значений функции), args — перечисленные через запятую
необязательные дополнительные аргументы для настройки гра-
фика. Если в функцию plot() передаётся только один аргумент-мас-
сив, то в качестве массива координат для рисования графика бу-
дут использованы индексы элементов этого массива.
Для изображения функциональной зависимости y = f(x) необхо-
димо создать массивы координат x = [x0, x1, …, xN] и массивы зна-
чений функции y = [y0, y1, …, yN] в соответствующих точках. Да-
лее приведён текст программы для рисования графика зависимо-
сти y = sin (x). Массив координат создаётся с помощью функции
linspace(), а массив значений функции — с помощью универсаль-
ной функции sin() из библиотеки NumPy. В конце программы вы-
зывается функция show() из модуля pyplot , предназначенная для
отображения рисунка на экране компьютера.

59
Глава 3. Библиотека визуализации Matplotlib

# подключение модуля pyplot под псевдонимом plt


import [Link] as plt
# подключение библиотеки numpy под псевдонимом np
import numpy as np

# массив координат - 30 точек, равнораспределенных


# в диапазоне от 0 до 10
x = [Link](0.0, 10.0, 30)
# массив значений функции в заданных координатах
y = [Link](x)

# рисование графика функции с помощью функции plot


[Link](x, y)
# отображение рисунка на экране
[Link]()

Результат работы программы показан на рис. 2.

Рис. 2. График функции sin(x), построенный с параметрами по умолчанию


(см. пояснение в тексте параграфа 3.2)

60
3.3. Создание рисунка с настраиваемыми параметрами

3.3. Создание рисунка с настраиваемыми параметрами

Все объекты в Matplotlib имеют иерархическую (древоподоб-


ную) структуру. Основными элементами являются рисунок, пане-
ли и оси координат (рис. 3).

Рисунок - Figure() fig

Панели - Axes() [Link][0] [Link][1] ...

Оси - Axis() [Link][0].xaxis [Link][0].yaxis ...

Рис. 3. Схема иерархии объектов, служащих для создания рисунка


в библиотеке Matplotlib

На верхнем уровне иерархии находится окно рисунка, которое


является контейнером для остальных элементов. Рисунок являет-
ся объектом класса Figure.
На рисунке может располагаться несколько (одна или больше)
панелей — независимых областей рисования. Панели являются
объектами класса Axes.
Каждая из панелей содержит основные элементы рисунка: оси
координат, метки на осях, текстовые метки, графики и т. д.
Алгоритм работы с рисунками можно записать в виде следую-
щей последовательности действий:
1. Создание окна рисунка. Окно создаётся с помощью функции
[Link]() из модуля pyplot. Например, конструкция
вида
fig = [Link](args)

создаёт окно рисунка и ассоциирует его с переменной fig. Данная


переменная является объектом класса Figure. Настройки окна
в дальнейшем осуществляются посредством обращения к полям
и методам этого объекта. Функция figure() может принимать не-
обязательные аргументы для настройки окна рисунка. Например,
конструкция
fig = [Link](figsize=(width, height))

61
Глава 3. Библиотека визуализации Matplotlib

создаёт рисунок шириной width и высотой height (в дюймах).


Будем в дальнейшем использовать имя fig в качестве имени
по умолчанию для создаваемого окна.
2. Добавление в окно панелей для рисования графиков. Одним
из способов добавления панели на рисунок является использова-
ние метода add_subplot(nrows, ncols, index) объекта «рисунок». Три
целочисленных аргумента указывают, что панель займёт на ри-
сунке положение под номером index в таблице из nrows строк и ncols
столбцов. Нумерация начинается с 1 в левом верхнем углу табли-
цы и увеличивается слева направо. Например, конструкция вида
ax = fig.add_subplot(1,1,1)

добавляет в ранее созданное окно fig одну панель и ассоциирует её


с переменной ax. Запятые между целочисленными аргументами
add_subplot() необязательны.
Настройки панели в дальнейшем осуществляются посредством
обращения к полям и методам этого объекта. Рассмотрим основ-
ные свойства панели:
•• set_xlim(a, b) — установка диапазона отображаемых по оси аб-
сцисс значений от a до b;
•• set_ylim(a, b) — установка диапазона отображаемых по оси ор-
динат значений от a до b;
•• set_xlabel(str) — установка строки str в качестве подписи оси
абсцисс;
•• set_ylabel(str) — установка строки str в качестве подписи оси
ординат;
•• set_title(str) — установка строки str в качестве заголовка пане-
ли;
•• set_xscale(str) — установка масштаба по оси абсцисс, если
str=”lin”, то будет использован линейный масштаб, если str=”log”,
то логарифмический. По умолчанию все оси отображаются с ли-
нейным масштабом;
•• set_yscale(str) — установка масштаба по оси ординат;
•• legend() — отображение легенды на рисунке.
3. Рисование графиков. В Matplotlib реализовано большое коли-
чество функций для рисования графиков, например:
•• plot(x, y, args) — рисование графика зависимости y от x с помо-
щью линий или маркеров. Через запятую после y можно перечис-

62
3.3. Создание рисунка с настраиваемыми параметрами

лить необязательные дополнительные аргументы args для на-


стройки свойств линий и маркеров (цвет, тип, толщина линии,
тип маркера и т. п.);
•• errorbar(x, y, xerr, yerr) — рисование графика зависимости y от x
с указанием баров ошибок xerr для x и yerr для y;
•• hist(x, bins) — построение гистограммы величины x, разбитой
на число столбцов, равное целому числу bins;
•• contour(X, Y, Z, [levels], args) — рисование контуров величины
Z, представляющей собой двумерный массив чисел. Аргументы X
и Y — массивы координат, в которых определены значения вели-
чины Z. Аргумент [levels] представляет собой список значений ве-
личины Z, которые необходимо изобразить контурами;
•• contourf(X, Y, Z, [levels], [args]) — то же, что contour(), только
пространство между контурами заполняется цветовой заливкой;
•• прочие.
4. Отображение окна рисунка на экране или его сохранение
в файл. Отображение рисунка на экране выполняется методом
show(). Сохранение рисунка в файл — методом savefig(), принима-
ющим в качестве аргументов строку-имя файла для сохранения,
а также необязательный список дополнительных аргументов,
указывающих параметры сохранения.
Рассмотрим пример скрипта, в котором реализованы основные
возможности создания рисунка с графиками нескольких функций
и ручной настройки его параметров: размера текста в подписях,
диапазонов по осям, подписей осей, заголовка рисунка:

# подключение библиотеки numpy под псевдонимом np


import numpy as np

# подключение модуля pyplot из библиотеки matplotlib


# под псевдонимом plt
import [Link] as plt

# пользовательская переменная для хранения размера шрифта


fsize=12

63
Глава 3. Библиотека визуализации Matplotlib

# настройка типа шрифта на рисунке с помощью изменения


# записей в словаре rcParams из модуля pyplot
[Link][‘[Link]’] = ‘serif’
[Link][‘[Link]’] = ‘Times New Roman’
# настройка размера шрифта в различных частях рисунка
# в заголовке:
[Link][‘[Link]’] = fsize
# в подписях осей:
[Link][‘[Link]’] = fsize
# в подписях меток на осях:
[Link][‘[Link]’] = fsize
[Link][‘[Link]’] = fsize
# в легенде рисунка:
[Link][‘[Link]’] = fsize

# массив координат – 50 точек в диапазоне [0, 10]


x = [Link](0.0, 10.0, 50)

# создаём окно рисунка.


# Для дальнейшей работы рисунок ассоциируется с переменной
# fig
fig=[Link]()

# добавляем панель (оси координат) с именем ax в окно fig.


# в дальнейшем настройка осей производится
# через обращение к переменной ax.
# аргументы 1, 1, 1 указывают, что на рисунке будет
# только одна панель для рисования графиков
ax=fig.add_subplot(1,1,1)

64
3.3. Создание рисунка с настраиваемыми параметрами

# график синуса:
# кружки (o), соединённые сплошной (-) чёрной линией.
# графику присваивается строковый идентификатор ‹1›
# для дальнейшего отображения в легенде
[Link](x, [Link](x), ‘ko-’, label=’1’)

# график косинуса:
# квадратики (s, размером 3), соединённые сплошной (-)
# оранжевой линией толщиной 1.
# графику присваивается строковый идентификатор ‹2›
# для отображения в легенде
[Link](x, [Link](x), ‘ks-’, color=’orange’, linewidth=1,
markersize=3.0, label=’2’)
# график синуса в квадрате:
# треугольники (^), соединённые сплошной (-) лиловой
# линией толщиной 1.
# графику присваивается строковый идентификатор ‹3›
# для отображения в легенде
[Link](x, ([Link](x))**2.0, ‘k^-’, color=’magenta’, linewidth=1,
label=’3’)

# график функции f(x)=x^0.15:


# чёрная штриховая линия толщиной 1.
# графику присваивается строковый идентификатор ‹x^2’
# для отображения в легенде.
# символ r и знаки доллара внутри строки позволяют
# вводить математические символы с помощью команд ТеХ
[Link](x, (x)**0.15, ‘k--’, linewidth=1, label=r’$x^2$’)

# легенда
[Link](loc=’best’)

# диапазон отображаемых значений по оси х


ax.set_xlim(-1.0, 11.0)
# диапазон отображаемых значений по оси y

65
Глава 3. Библиотека визуализации Matplotlib

ax.set_ylim(-1.5, 1.5)

# подпись по оси x
ax.set_xlabel(r’$x$’)
# подпись по оси y
ax.set_ylabel(r’$f(x)$’)

# заголовок рисунка
ax.set_title(‘Мой первый рисунок’)
# сетка на рисунке
[Link]()

# сохраняем в файл с именем fig1 типа PNG с разрешением


# 300 точек на дюйм
# (dpi – dots per inch), с альбомной ориентацией
[Link]("[Link]", orientation=’landscape’, dpi=300)

Результат работы программы показан на рис. 4.

Рис. 4. Демонстрация возможностей создания одномерных графиков


с помощью pyplot

66
3.3. Создание рисунка с настраиваемыми параметрами

Обсудим приведённую выше программу для рисования графи-


ков.
Каждый график добавляется на текущую панель рисунка с по-
мощью функции plot().
График функции синус на рис. 1 изображён с помощью команды
[Link](x, [Link](x), ‘ko-’, label=’1’)

Тип точек и соединительной линии может быть указан с помо-


щью дополнительного строкового аргумента в команде plot() по-
сле первых двух обязательных аргументов — отображаемых мас-
сивов. Данная строка имеет следующий формат
‘CDL’

где
C — буква-код, указывающая цвет линии. Возможные вариан-
ты: k (чёрный), b (blue — синий), c (cyan — голубой), g (green — зе-
лёный), m (magenta — пурпурный), r (red — красный), y (yellow —
жёлтый), w (white — белый).
•• D — символ, указывающий тип соединительной точки (мар-
кера). Варианты: s (square — квадратик), d (diamond — ромбик),
o (кружок), * (звёздочка), ^ (треугольник вверх), v (треугольник
вниз).
•• L — тип линии. Варианты: - (сплошная линия), -- (штриховая
линия), : (пунктирная линия), -. (штрихпунктирная линия).
Например, строка ‘ko-’ в примере выше означает, что график
нужно нарисовать чёрной сплошной линией, а соединительные
точки отображать с помощью кружочков.
Каждый из указанных параметров можно настроить с помощью
отдельного ключевого слова в списке аргументов функции plot().
Например, график косинуса на рис. 4 нарисован жёлтыми квадра-
тиками размером 3 (markersize = 3.0), соединёнными сплошной
оранжевой линией (color = ‘orange’) толщиной 1 ( linewidth = 1),
[Link](x, [Link](x), ‘ks-’, color=’orange’, linewidth=1,
markersize=3.0, label=’2’)

Аргумент label в команде plot() присваивает текущему графику


имя-строку, которая будет отображена в легенде рисунка.

67
Глава 3. Библиотека визуализации Matplotlib

3.4. Добавление нескольких панелей на рисунок

Команда add_subplot() добавляет на текущий рисунок ( fig в при-


мере выше) несколько осей координат (не менее 1) для рисования
графиков. Синтаксис этой функции:
ax_k = add_subplot(n, m, k)

Запятые могут быть опущены. Эта команда создаёт на рисунке fig


таблицу из n×m ячеек (n строк и m столбцов) и помещает текущую
панель в ячейку с индексом k. В таблице может быть не более n×m
панелей, то есть число k может пробегать значения от 1 до n×m.
Текущая создаваемая командой add_subplot() панель ассоцииру-
ется с пользовательской переменной ax_k . На рис. 5 приведена
диаграмма, на которой схематически показано, как можно распо-
ложить 6 различных панелей (осей координат) в таблице из трёх
строк и двух столбцов на одном рисунке.

Рис. 5. Диаграмма расположения шести панелей


с именами ax1, … ax6 в три столбца и две строки на рисунке fig

68
3.5. Двумерные графики

3.5. Двумерные графики

В Matplotlib реализовано несколько способов построения дву-


мерных графиков. Рассмотрим способ графического отображе-
ния скалярного поля — функции F(x, y), значения которой заданы
на координатной плоскости (x, y) в области x∈[xL,xR], y∈[yT, yB]. Рас-
пределения F(x, y) можно изобразить с помощью изолиний, назы-
ваемых также линиями уровня, — линий в плоскости (x, y), на ко-
торых функция F имеет определённое значение. Для построения
изолиний в Matplotlib имеется две функции.
Функция
contour(x, y, f, levels=[values_list], args)

отображает изолинии величины, заданной в виде двумерного


массива f. Аргументы x и y представляют собой массивы коорди-
нат точек на плоскости, в которых задана величина f. Параметр
[values_list] — список значений f, которые необходимо отобразить
изолиниями. Если вместо списка уровней указывается целое
число, то на графике будет отображено соответствующее число
­равнораспределённых изолиний. Функция может принимать до-
полнительные необязательные аргументы args, перечисляемые
через запятую и предназначенные для настройки параметров
отображения изолиний. Например, аргумент cmap=’Name’ указы-
вает, что для отображения изолиний следует использовать цвето-
вую схему с именем Name. Полный список имеющихся цветовых
схем можно просмотреть с помощью команды [Link].
colormaps().
Величины x и y могут быть либо одномерными массивами ко-
ординат в каждом из направлений, либо матрицами, задающи-
ми сетку этих координат. В первом случае длины массивов x и y
должны соответствовать числу столбцов и строк матрицы f соот-
ветственно. Во втором случае размеры (количество строк и столб-
цов) массивов x, y и f должны быть одинаковы. Удобным способом
создания матрицы координат является функция meshgrid из биб­
лиотеки NumPy. Конструкция вида
xx, yy = meshgrid(x, y)

создаёт на основе одномерных массивов координат x и y сет-

69
Глава 3. Библиотека визуализации Matplotlib

ки ­соответствующих координат в двумерных массивах xx и yy.


На рис. 6 продемонстрирована работа функции meshgrid.

Рис. 6. Схематическая иллюстрация работы функции meshgrid()


из библиотеки NumPy

Рассмотрим экспоненциальную функцию вида

F(x, y) = exp(–x2 – y2).

Ниже приведён листинг программы для отображения 10 изоли-


ний функции F(x,y) в области x∈[–2, 2], y∈[–2, 2]. Одномерные мас-
сивы координат создаются с помощью функции linspace() из биб­
лиотеки NumPy. Затем эти массивы преобразуются к матрицам
координат xx и yy с помощью meshgrid(). Созданные матрицы ко-
ординат используются для расчёта значений функции F на сетке.

# -*- coding: utf-8 -*-


"""
Created on Fri Oct 11 00:00:00 2018

Рисование двумерного распределения скалярной величины


с помощью изолиний (линий уровня)

@author: С.А. Хайбрахманов

70
3.5. Двумерные графики

"""
# подключение библиотеки numpy и модуля pyplot
import numpy as np
import [Link] as plt

# создание рисунка размером 15 на 15 см


# с одной панелью
inch = 2.54 # дюйм в см
fig1 = [Link](figsize=(15.0/inch, 15.0/inch))
ax1 = fig1.add_subplot(111)
# подписи осей на панели
ax1.set_xlabel(r’$x$’)
ax1.set_ylabel(r’$y$’)

# массив x-координат - 50 точек в диапазоне от -2 до 2


x = [Link](-2.0, 2.0, 50)
# массив y-координат - 50 точек в диапазоне от -2 до 2
y = [Link](-2.0, 2.0, 50)
# матрицы (сетка) координат
xx, yy = [Link](x, y)
# вычисление значений функции на сетке
F = [Link](-xx**2 - yy**2)

# отображение 10 изолиний величины F.


# график изолиний ассоциируется с переменной CS1
CS1 = [Link](xx, yy, F, 10)

# добавление подписей изолиний на графике CS1.


# с помощью обращения к полю levels (списку изолиний
# на графике CS1) подписи выводятся только
# для каждой второй линии

71
Глава 3. Библиотека визуализации Matplotlib

[Link](CS1, [Link][::2])

[Link]()

На рис. 7 показан результат работы программы.

Рис. 7. Пример использования функции contour()

Для отображения распределения скалярной величины f на пло-


скости (x, y) можно также воспользоваться функцией
contourf(x, y, f, levels=[values_list], args)

которая действует аналогично contour(), но дополнительно выпол-


няет заливку цветом областей между изолиниями.
Векторное поле на плоскости может быть изображено с помо-
щью функции
quiver(x, y, Vx, Vy)

72
3.5. Двумерные графики

где x и y — матрицы координат на плоскости, Vx и Vy — матрицы


соответствующих координат векторного поля. Легенда для вектор-
ного поля добавляется на рисунок командой
quiverkey(field_name, X=…, Y=…, U=…, label=…, labelpos=…)

где field_name — имя векторного поля, нарисованного командой


quiver(), X и Y указывают координаты для размещения легенды
на рисунке ( X=1, Y=1 соответствует правому верхнему углу ри-
сунка), с помощью параметра U указывается длина вектора, ко-
торый будет отображён в легенде, параметр label указывает стро-
ку-подпись в легенде, параметр labelpos указывает, как будет рас-
полагаться текст подписи относительно стрелки в легенде (‘N’ —
сверху, ‘W’ — слева, ‘S’ — снизу, ‘E’ — справа).
Далее приведён листинг программы с примером использования
contourf() и quiver() для отображения поля F(x,y) и соответствующе-

го векторного поля ∇F=(∂F⁄∂x,∂F⁄∂y).

# -*- coding: utf-8 -*-


"""
Created on Fri Oct 11 00:00:00 2018

Рисование двумерного распределения скалярной величины


с помощью изолиний (линий уровня) и её градиента с помощью век-
торов

@author: С.А. Хайбрахманов


"""
# подключение библиотеки numpy и модуля pyplot
import numpy as np
import [Link] as plt

# создание рисунка размером 15 на 15 см


# с одной панелью
inch = 2.54 # дюйм в см
fig1 = [Link](figsize=(18.0/inch, 15.0/inch))
ax1 = fig1.add_subplot(111)
# подписи осей на панели

73
Глава 3. Библиотека визуализации Matplotlib

ax1.set_xlabel(r’$x$’)
ax1.set_ylabel(r’$y$’)

# массив x-координат - 50 точек в диапазоне от -2 до 2


x = [Link](-2.0, 2.0, 50)
# массив y-координат - 50 точек в диапазоне от -2 до 2
y = [Link](-2.0, 2.0, 50)
# матрицы (сетка) координат
xx, yy = [Link](x, y)
# функция для отображения
def F(x, y):
return [Link](-x**2 - y**2)

# градиент функции
def gradF(x, y):
# x-координата градиента
gradF_x = -2 * x * F(x, y)
# y-координата градиента
gradF_y = -2 * y * F(x, y)
return [gradF_x, gradF_y]

# вычисление значений функции на сетке


FF = F(xx, yy)
# отображение 20 изолиний величины F с заливкой.
# график изолиний ассоциируется с переменной CS
# аргумент cmap указывает используемую цветовую схему
CS = [Link](xx, yy, FF, 20, cmap=’Blues’)

# добавление на рисунок легенды,


# указывающей соответствие цветов заливки

74
3.5. Двумерные графики

# уровням величины F на графике CS


[Link](CS, label=r’$F(x,y)$’)

# вычисление градиента функции на сетке


grad = gradF(xx, yy)

# рисование поля градиента с помощью векторов


# векторное поле ассоциируется с переменной q
q = [Link](xx, yy, grad[0], grad[1])

# отображение легенды для векторного поля -


# стрелка длиной 1 для масштаба
[Link](q, X=0.5, Y=1.05, U = 1, label=r’$|\vec{\nabla}
F|=1$’, labelpos=’E’)

[Link]()

На рис. 8 показан результат действия программы.

Рис. 8. Пример использования функций contourf() и quiver()

75
Глава 3. Библиотека визуализации Matplotlib

3.6. Визуализация данных из текстовых файлов

Для рисования графиков по данным из текстового файла удобно


воспользоваться командой loadtxt() из библиотеки NumPy:

from matplotlib import pyplot as plt


import numpy as np

data = [Link]("[Link]")

fig = [Link]()
ax = fig.add_subplot(1, 1, 1)

ax.set_xlim(-1.0, 11.0)
ax.set_ylim(-1.1, 1.1)
ax.set_xlabel(r’$x$’)
ax.set_ylabel(r’$f(x)$’)
ax.set_title(u’Данные из файла’)

#рисование графика зависимости первого столбца от


#нулевого
[Link](data[:, 0], data[:, 1], ‘ko-’, color=’grey’, label=r’$d_1$’)
#рисование графика зависимости второго столбца от
#нулевого
[Link](data[:, 0], data[:, 2], ‘gs-’, label=r’$d_2$’)

[Link](loc=’best’)
[Link]()

Вывод данной программы показан на рис. 9.

76
3.6. Визуализация данных из текстовых файлов

Содержимое файла [Link]:


0 0 1
1 0.84 0.54
2 0.91 –0.42
3 0.14 –0.99
4 –0.76 –0.65
5 –0.96 0.28
6 –0.28 0.96
7 0.66 0.75
8 0.99 –0.15
9 0.41 –0.91
10 –0.54 –0.84

Рис. 9. Графики данных из файла

77
Глава 3. Библиотека визуализации Matplotlib

3.7. Математические символы на рисунках

На рисунки matpotlib можно добавлять математические над-


писи. Набор математических выражений осуществляется по пра-
вилам системы ТеХ. Перед строкой, содержащей математическое
выражение, помещается буква r, а внутри кавычек используются
знаки доллара. Например, строка
r’$\frac{1}{n}\sum\limits_{i=1}^n(x_i-\langle x\rangle)^2$’

будет отображена в соответствующем месте рисунка как


1 n
∑ ( xi − x ).
2

n i =1

Задание для самостоятельной работы

Модифицируйте программу рисования графиков, приведённую


в параграфе 3.3, в соответствии со следующими требованиями:
1. Уберите заголовок рисунка, сетку и легенду.
2. Нарисуйте график каждой из четырёх функций в отдельной
панели на рисунке. Оси каждой панели должны быть подписаны.
На каждой панели сверху по центру следует добавить текстовую
метку: «(а)» для панели 1, «(б)» для панели 2, «(в)» для панели 3,
«(г)» для панели 4.
3. График синуса должен быть нарисован сплошной чёрной ли-
нией, график косинуса — пунктирной чёрной линией, график
квад­рата косинуса — штриховой чёрной линией, график функции
x0.15 — сплошной серой линией.
4. Установите в каждой панели диапазон значений по оси аб-
сцисс от 0 до 2π. Диапазон значений по оси ординат на каждой па-
нели должен быть таким, чтобы график соответствующей функ-
ции был виден целиком.

78
Рекомендуемая литература

Вопросы для самоконтроля

1. Опишите иерархию объектов на рисунке в Matplotlib.


2. Пусть fig — объект-рисунок, созданный функцией figure(). По-
ясните результат работы следующих команд:
ax1 = fig.add_subplot(2, 1, 1)
ax2 = fig.add_subplot(2, 1, 2)
Как будут располагаться панели на рисунке fig?
3. Ниже приведены команды рисования графиков зависимостей
y1(x), y2(x), y3(x). Какими линиями будут нарисованы графики 1, 2,
и 3?
[Link](x, y1, ‘k-’, label=’1’)
[Link](x, y2, ‘g:’ , label=’2’)
[Link](x, y3, ‘--’, color=’orange’ , label=’3’)
4. В чём отличие функций contour() и contourf()?
5. Пусть функция f определена в некоторой области на плоско-
сти (x, y) и имеет в этой области минимальное значение 0, мак-
симальное значение 10. Чем будет отличаться вывод команд
contour(x, y, f, levels=[0, 5, 10]) и contour(x, y, f, 10)?
6. Воспользуйтесь функцией help() и выясните, для чего предна-
значена функция [Link]().

Рекомендуемая литература

1. Шабанов, П. А. Научная графика в python [Электронный ре-


сурс] / П. А. Шабанов. — URL: [Link]
graphics_in_python (дата обращения: 16.10.2019).
2. Hunter, J. Matplotlib [Электронный ресурс] / J. Hunter,
M. Droettboom. — URL: [Link]
(дата обращения: 16.10.2019).
3. Hunter, J. Matplotlib [Электронный ресурс] / J. Hunter, D. Dale,
E. Firing, M. Droettboom and the Matplotlib development team. — URL:
[Link] (дата обращения 16.10.2019)

79
Глава 4 
Библиотека SciPy
для научных
и инженерных расчётов

В данной главе описываются базовые возможности библиоте-


ки SciPy, предназначенной для научных и инженерных расчётов.
Рассматриваются инструменты численного интегрирования, ре-
шения обыкновенных дифференциальных уравнений, а также за-
дачи интерполяции. В завершение приводится самостоятельное
задание и вопросы для самоконт­роля.

4.1. Общие сведения

SciPy — это открытая библиотека научных инструментов для


языка программирования Python. Инструменты SciPy предназна-
чены для проведения стандартных научных расчётов. Функции,
реализованные в SciPy, оптимизированы и протестированы. Они
могут использоваться в качестве инструмента для решения раз-
личных научных задач без необходимости самостоятельной ре-
ализации стандартных методов вычислительной математики
и физики. Библиотека SciPy опирается на работу с многомерными
массивами типа ndarray из библиотеки NumPy.
Список модулей SciPy:
•• [Link] — математические и физические константы;
•• [Link] — специальные функции (пр., функции Бесселя,
эллиптические функции, гамма-функция, функция ошибок);
•• [Link] — численное интегрирование (методы трапе-
ции, Симпсона, Ромберга и др.), решение обыкновенных диффе-
ренциальных уравнений (ОДУ);

80
4.1. Общие сведения

•• [Link] — решение задач оптимизации, а именно: ми-


нимизация скалярных функций многих аргументов, глобальная
оптимизация, аппроксимация кривых, анализ данных методом
наименьших квадратов, поиск корней нелинейных алгебраиче-
ских уравнений и систем линейных алгебраических уравнений;
•• [Link] — линейная алгебра;
•• [Link] — работа с разреженными матрицами;
•• [Link] — интерполяция дискретных данных (одно-
мерных и двумерных);
•• [Link] — быстрое преобразование Фурье;
•• [Link] — обработка сигналов;
•• [Link] — статистические алгоритмы.
Рассмотрим пример подключения конкретного модуля integrate
из библиотеки SciPy:
In [1]: from scipy import integrate

Справку по целому модулю или по любой его функции можно


получить с помощью функции help(),
In [2]: help([Link])
Help on function quad in module [Link]:
quad(func, a, b, args=(), full_output=0, epsabs=1.49e-08,
epsrel=1.49e-08, limit=50, points=None, weight=None, wvar=None,
wopts=None, maxp1=50, limlst=50)
Compute a definite integral.
Integrate func from `a` to `b` (possibly infinite interval)
using a
technique from the Fortran library QUADPACK.

(Далее следует описание аргументов функции quad и возвраща-


емого значения)

81
Глава 4. Библиотека SciPy для научных и инженерных расчётов

4.2. Численное интегрирование

В модуле [Link] реализовано несколько функций для вы-


числения определённых интегралов. Наиболее простой является
функция quad(), которая имеет следующий синтаксис:
quad (func, a, b, …)

В quad() реализован численный метод из Fortran-библиотеки


QUADPACK ([Link] Функ-
ция принимает как минимум три аргумента:
•• func — имя подынтегральной функции. Функция должна быть
определена по правилам языка Python (см. параграф 1.8). Если
функция зависит от более чем одного аргумента, то интегрирова-
ние ведётся по первому аргументу;
•• a — нижний предел интегрирования (число типа float);
•• b — верхний предел интегрирования (число типа float).
Список и значение дополнительных аргументов можно полу-
чить с помощью команды help(quad).
Например, вычислим интеграл
4

∫ 3x dx.
2

Точное значение этого интеграла: 64. Реализация в интерактив-


ной оболочке IPython:
In [1]: from scipy import integrate
In [2]: def f(x):
…: return 3.0 * x**2
In [3]: [Link](f, 0.0, 4.0)
Out [3]: (64.0, 7.105427357601002e-13)

Функция quad() возвращает кортеж из двух элементов, пер-


вый — значение интеграла, второй — точность вычисления.
В примере выше ответ совпадает с точным значением и получен
с точностью до 13-го знака после запятой.
Рассмотрим пример интеграла с пределом, равным бесконечно-
сти:

82
4.3. Решение обыкновенных дифференциальных уравнений

∫e
−x
dx.
0

Точное значение этого интеграла: 1. Для реализации численно-


го решения интеграла воспользуемся универсальной функцией
exp() и зарезервированной константой inf (бесконечность) из биб­
лиотеки NumPy.
In [4]: import numpy as np
In [5]: def f2(x):
…: return [Link](-x)
In [6]: [Link](f2, 0.0, [Link])
Out [6]: (1.0000000000000002, 5.842607038578007e-11)

Кроме quad(), в модуле [Link] доступны также другие


методы нахождения интегралов: trapz() (метод трапеций), sims()
(метод Симпсона), romb() (метод Ромберга). В отличие от quad(),
в функциях trapz(), simps() и romb() сетка точек интегрирования
задаётся пользователем, а не устанавливается автоматически.

4.3. Р ешение обыкновенных


дифференциальных уравнений

Помимо функций для численного интегрирования, в модуле


[Link] содержатся функции для решения ОДУ первого по-
рядка вида

dy  
= f ( y, x),
dx
 
y ( x0 ) = y0 ,

где
 y = [ y 0 , y1 ,..., y n −1 ] — список неизвестных функций (n штук),
f = [ f 0 , f 1 ,..., f n −1 ] — список значений производных функций (пра-
 0 1 n –1
вые части уравнений — заданные функции), y0 = [ y0 , y0 ,..., y0 ] –
список начальных условий.

83
Глава 4. Библиотека SciPy для научных и инженерных расчётов

Рассмотрим функцию odeint(). В ней реализован метод LSODA


из Fortran-библиотеки ODEPACK ([Link]
odepack/). Синтаксис функции:
odeint(func, y0, x, …)

где
•• func — список функций правых частей уравнений;
•• y0 — список начальных условий;
•• x — массив точек, в которых необходимо найти значение ис-

комой функции y ( x). Первый элемент массива должен совпадать
с начальной точкой интегрирования x0 ;
•• многоточием обозначены необязательные аргументы (см.
help(odeint)).
Функция odeint() возвращает двумерный массив типа ndarray
значений функции y во всех заданных точках x. Начальное зна-
чение y0 хранится в первой строке. Массив решения имеет сле-
дующую форму (shape): ( len( x), len(y0)). То есть число строк равно
количеству точек интегрирования, число столбцов — количеству
уравнений. Например, в случае интегрирования одного уравне-
ния результатом работы функции odeint() будет двумерный мас-
сив, содержащий один столбец, в котором хранятся значения ис-
комой функции, начиная с y0.

Пример решения ОДУ первого порядка


Для примера решим следующее дифференциальное уравнение:
dy
= −2 y
dx

c начальным условием y(0) = 1.


In [1]: from scipy import integrate
In [2]: import numpy as np
In [3]: def f(y, x):
…: return -2.0 * y
In [4]: xi = [Link](0, 1, 10)
In [5]: y0 = 1.0
In [6]: sol = [Link](f, y0, xi)

84
4.3. Решение обыкновенных дифференциальных уравнений

In [7]: sol
Out [7]:
array([[ 1. ],
[ 0.80073742],
[ 0.64118042],
[ 0.51341714],
[ 0.41111231],
[ 0.329193 ],
[ 0.26359714],
[ 0.21107209],
[ 0.16901331],
[ 0.13533527]])
In [8]: sol[0]
Out [8]: array([ 1.])
In [9]: sol[9]
Out [9]: array([ 0.13533527])

Пример решения системы двух ОДУ


Рассмотрим уравнение гармонических колебаний:
d2x
+ ω2 x =0.
dt 2
c начальными условиями x(0) = x0 = –5, dx/dt(0) = v0 = 0 при ω =1.5.
Сведём данное уравнение второго порядка к системе двух урав-
нений первого порядка с помощью замены
dx dv d 2 x
,
= v= .
dt dt dt 2

Тогда получим
dv
= −ω2 x,
dt
dx
= v.
dt
С начальными условиями x(0) = x0, v(0) = v0.

85
Глава 4. Библиотека SciPy для научных и инженерных расчётов

# подключение модуля integrate из библиотеки scipy


from scipy import integrate
# подключение библиотеки numpy под псевдонимом np
import numpy as np
# подключение модуля pyplot из библиотеки matplotlib
# под псевдонимом plt
from matplotlib import pyplot as plt

# частота гармонического осциллятора


w = 1.5
# вектор-функция правых частей уравнений:
# f = [f0, f1], где f0 = -w^2*x, f1 = v.
# полагается, что f зависит от (y, t), причём y - это
# список из двух чисел:
# y = [v, x]
def f(y, t):
v = y[0]
x = y[1]

f0 = -w**2 * x
f1 = v
return [f0, f1]

# массив точек интегрирования


ti = [Link](0, 10, 50)
# начальная координата
x0 = -5.0
# начальная скорость
v0 = 0.0
# список начальных условий
y0 = [x0, v0]

86
4.3. Решение обыкновенных дифференциальных уравнений

# решение ОДУ
sol = [Link](f, y0, ti)

# рисунок для построения графиков функций x(t) и v(t)


fig = [Link]()
# панель для рисования графика координаты
ax1 = fig.add_subplot(121)
# панель для рисования графика скорости
ax2 = fig.add_subplot(122)

ax1.set_xlabel(r’$t$’)
ax1.set_ylabel(r’$x$’)
ax1.set_title(‘координата’)
# график x(t) - зависимость нулевого столбца вектора
# решения sol от ti
[Link](ti, sol[:, 0])

ax2.set_xlabel(r’$t$’)
ax2.set_ylabel(r’$v$’)
ax2.set_title(‘скорость’)
# график v(t) - зависимость первого столбца вектора
# решения sol от ti
[Link](ti, sol[:, 1])

# настройка оптимального расположения панелей


plt.tight_layout()
[Link]("[Link]")

На рис. 10 графически показано решение рассматриваемого ОДУ.

87
Глава 4. Библиотека SciPy для научных и инженерных расчётов

Рис. 10. Решение ОДУ второго порядка (гармонический осциллятор)

4.4. Интерполяция
В модуле [Link] содержится набор инструментов для
интерполяции одномерных и многомерных данных различными
методами. Рассмотрим простейший пример интерполяции одно-
мерного набора данных с помощью функции interp1d(). Синтаксис
вызова функции:
fi = interp1d(x, f0, ‘method’, …)

Функция interp1d() принимает в качестве первых двух аргу-


ментов одномерные массивы координат x и соответствующих
значений некоторой величины f0. Функция возвращает класс,
реализующий функцию, интерполирующую исходные данные
заданным методом. В interp1d() реализовано несколько спосо-
бов интерполяции: линейная (‘method’=’linear’ ), квадратичная
(‘method’=’qudratic’ ), кубическая (‘method’=’cubic’ ) и др. По умолча-
нию, когда параметр ‘method’ не указан, используется линейная
интерполяция.

88
4.4. Интерполяция

Ниже приведён пример программы с использованием interp1d()

# -*- coding: utf-8 -*-


"""
Created on Fri Oct 11 00:00:00 2018
Интерполяция одномерных данных
@author: С.А. Хайбрахманов
"""
#подключение библиотек
import [Link] as plt
import numpy as np
from [Link] import interp1d

# функция для генерации данных,


# по которым будет строиться интерполяция
def f_exact(x):
return [Link](x)**2

# массив координат, по которым будет делаться интерполяция


x = [Link](0, 2.0 * [Link], 10)
# массив значений, по которым будет делаться интерполяция
y = f_exact(x)

# интерполяция данных методом по умолчанию


# (линейная интерполяция)
fi_1 = interp1d(x, y)
# кубическая интерполяция
fi_2 = interp1d(x, y, ‘cubic’)

# массив координат для построения


# графика интерполированных функций
xi = [Link](0, 2.0 * [Link], 25)
# массивы значений интерполированых функций
# для построения графиков
yi_1 = fi_1(xi)

89
Глава 4. Библиотека SciPy для научных и инженерных расчётов

yi_2 = fi_2(xi)

# настройки осей
[Link](‘x’)
[Link](‘y’)
[Link](0.0, 1.5)

# рисование графиков
[Link](x, y, ‘o’, label=’исходные данные’)
[Link](xi, f_exact(xi), ‘-’, color=’grey’, linewidth=2.5,
label=’точная функция’)
[Link](xi, yi_1, ‘--’, label=’линейная интерполяция’)
[Link](xi, yi_2, ‘k:’, label=’кубическая интерполяция’)

# легенда, располагающаяся сверху по центру панели


[Link](loc=’upper center’)

[Link]()

На рис. 11 показан результат работы программы.

Рис. 11. Пример интерполяции с помощью interp1d()

90
Варианты заданий для самостоятельной работы

Варианты заданий для самостоятельной работы

1. Напишите программу для численного вычисления опреде-


лённого интеграла с помощью средств SciPy. Сравните результа-
ты вычисления различными функциями интегрирования с точ-
ным решением.

x3 xdx
1) ∫ x8 − 2 dx, от 0 до 1; 9) ∫x 4
+ 3x 2 + 2
, от –5 до 5;

dx
2) ∫ x x2 + 1 , от 0.1 до 1; 10) ∫ sin( x)sin(3x)dx, от 0 до π;
dx x π
3) ∫ x 1 − x , от 0.01 до 0.99; 11) ∫ tan( 2 )dx, от 0 до 2
;

dx x +1 π π
4) ∫ sin x , от 0.01 до 0.5; 12) ∫ 3− x 2
dx, от –
4
до ;
2
dx π cos( x)dx
5) ∫ cos x , от 0 до 4 ; 13) ∫
sin( x) + 2
, от –π до π;

x2 − 1
∫x dx, от –0.9 до 0.9; ∫x
2
6) 4
14) exp(− x)dx, от –1 до 1;
+1
x
∫x
33
7) 1 + x 2 dx, от –5 до 5; 15)
∫ 3 + x2
dx, от –2 до 5.
dx
8) ∫x 2
+x−2
, от –1.9 до 0.9;

2. Напишите программу для численного решения обыкновен-


ного дифференциального уравнения с заданным начальным ус-
ловием с помощью средств SciPy. Сравните результат вычисления
с точным решением. Нарисуйте графики точного и численного ре-
шений, а также относительной ошибки численного решения.
1 π π
y+ y=
1)  y   2,=
при= y   1;
(sin x)3  4 4
cosh x при y ( 0 ) =
y+ y=
2)  π, y ( 0 ) =1;

sin x – cos 2 x при y ( 0 ) =


y+ y=
3)  π, y ( 0 ) =
2;

91
Глава 4. Библиотека SciPy для научных и инженерных расчётов

2
2 при y (1) = 1, y (1) = −1;
y − 4 xy + 6 y =
4) x 

y + 2( y ) 2 =
5)  y (10 ) 1,=
0 при= y (10 ) 1;

y + 4y =
6)  y ( 0 ) 1,=
0 при= y ( 0 ) 1;
1
y + y =1 −
7)  при y ( π / 2 ) = 0, y ( π / 2 ) = 1;
sin x
y − 3y =
8)  y ( 0 ) 1,=
0 при= y ( 0 ) 0;

y+ y=
9)  y ( 0 ) 1,=
x при= y ( 0 ) 0;

10)=y exp(− y )sin( x) при y ( 0 ) = 0;


1
при y (1) = 1;
2
11) x y =
cos( y )
0 при y ( 0 ) = 0;
12) 10 y + 25 y =

e2 x при y ( 0 ) = 1;
13) 2 y + y =

14) 3 y= 2 − x при y ( 0 ) = 1;


2

y cos( x) − 3sin( x) при y ( 0 ) = 1.


15) y − 2=

dy dy
=
Использованные обозначения: y = , 
y .
dx dx

Вопросы для самоконтроля

1. Результатом работы функции [Link]() является кортеж


из двух чисел. Что это за числа?
2. В каком модуле SciPy содержатся функции для решения обык-
новенных дифференциальных уравнений?
3. Для решения систем ОДУ какого вида предназначена функция
odeint()?

92
Рекомендуемая литература

4. Воспользуйтесь функцией help() и выясните, какие функции


помимо odeint() имеются в модуле integrate для решения обыкно-
венных дифференциальных уравнений.
5. Допустим, что g и f — одномерные массивы одинакового раз-
мера. Поясните результат работы команды
G = interp1d(g, f, ‘cubic’)

Какой тип имеет величина G?

Рекомендуемая литература

1. Нуньес-Иглесиас, Х. Элегантный SciPy / Х. Нуньес-Иглесиас,


Ш. ван дер Уолт, Х. Дэшноу. — М. : ДМК Пресс, 2018. — 266 с.
2. The SciPy community. SciPy Tutorial [Электронный ресурс] / The
SciPy community. — 2008–2019. — URL: [Link]
reference/tutorial/[Link] (дата обращения: 16.10.2019)

93
Заключение

В настоящее время существует большое количество как коммер-


ческих, так и бесплатных программных пакетов для проведения
научных расчётов, и анализа данных. Данное пособие посвяще-
но одному из таких инструментов: библиотекам NumPy, Matplotlib
и SciPy для языка программирования Python. Данные инструмен-
ты являются бесплатными, кроссплатформенными, имеют ши-
рокий спектр возможностей, хорошо документированы, что обу-
словливает удобство их применения. На данный момент Python
является распространённым инструментом для решения вычис-
лительных задач и анализа данных в различных областях науки
и техники.
Следует отметить, что возможности рассмотренных пакетов
ограничены лишь некоторыми стандартными математическими
задачами, такими как задачи линейной алгебры, вычисление ин-
тегралов, решение алгебраических уравнений и систем ОДУ пер-
вого порядка. Решение научных задач зачастую сопряжено с необ-
ходимостью рассмотрения систем дифференциальных уравнений
в частных производных и интегро-дифференциальных уравне-
ний. Например, моделирование магнитогазодинамических про-
цессов в плазме на Земле и в космосе основано на решении систе-
мы нелинейных уравнений магнитной газодинамики в областях
со сложной геометрией. Для подобных задач требуется разработ-
ка специализированных численных алгоритмов, программных
комп­лексов и кодов.
В пособии изложены лишь базовые возможности Python и биб­
лиотек NumPy, Matplotlib и SciPy. Оно может быть использовано
для первоначального знакомства с языком Python и данными биб­
лиотеками с целью дальнейшего более глубокого самостоятельно-
го изучения их возможностей, таких, например, как написание
классов, обработка исключений и др. Помимо продемонстриро-
ванных в пособии возможностей вычисления интегралов, реше-
ния ОДУ и интерполяции данных, библиотека SciPy обладает ин-

94
струментами для решения задач линейной алгебры, аппроксима-
ции данных, Фурье-анализа, обработки сигналов, статистических
расчётов и т. д.
Удобство применения Python для научных расчётов связано,
в частности, с возможностью интерактивного режима работы,
когда вводимые команды сразу же исполняются интерпретато-
ром. Интерактивность позволяет быстро производить отдельные
виды вычислений и визуализировать результаты расчётов без не-
обходимости тратить время на написание отдельных программ.
В пособии рассматривается интерактивный режим работы в обо-
лочке IPython. В настоящее время данный подход развивается
в проекте Jupiter (URL: [Link] Jupiter представляет со-
бой интерактивную оболочку с веб-интерфейсом для разработки
программ. Веб-приложение Jupiter Notebook позволяет создавать
документы, содержащие интерактивный программный код, урав-
нения, рисунки и обычный текст. Имеется возможность совмест-
ной работы над такими документами. Блокноты Jupiter могут ис-
пользоваться для дальнейшего изучения возможностей Python
для научных расчётов.

95
Список литературы

1. Walt van der, S. The NumPy Array: A Structure for Efficient


Numerical Computation / S. van der Walt, S. C. Colbert and Gaël Varo //
Computing in Science & Engineering. — 2011. — Vol. 13. — P. 22–30.
2. Millman, K. J. Python for Scientists and Engineers / K. J. Millman,
M. Aivazis // Computing in Science & Engineering. — 2011. — Vol. 13. —
P. 9–12.
3. Jones, E. SciPy: Open Source Scientific Tools for Python / E. Jones,
E. Oliphant, P. Peterson, et al. — 2001. — URL: [Link]
[Online; доступ 11-10-2019].
4. Oliphant, T. E. Python for Scientific Computing / T. E. Oliphant //
Computing in Science & Engineering. — 2007. — Vol. 9. — P. 10–20.
5. Hunter, J. D. Matplotlib: A 2D Graphics Environment / J. D. Hunter //
Computing in Science & Engineering. — 2007. — Vol. 9. — P. 90–95.
6. Pérez, F. IPython: A System for Interactive Scientific Computing /
F. Pérez, B. E. Granger // Computing in Science & Engineering. — 2007. —
Vol. 9. — P. 21–29.

96
Учебное издание

ХАЙБРАХМАНОВ Сергей Александрович

ОСНОВЫ НАУЧНЫХ РАСЧЁТОВ


НА ЯЗЫКЕ ПРОГРАММИРОВАНИЯ
PYTHON

Учебное пособие

Корректура и вёрстка М. В. Трифоновой


Дизайн обложки Ольги Харитоновой

Подписано в печать 04.12.19.


Формат 60×84 1/16. Бумага офсетная.
Усл. печ. л. 5,7. Уч.-изд. л. 5,0.
Тираж 100 экз. Заказ 451
Цена договорная

Челябинский государственный университет


454001 Челябинск, ул. Братьев Кашириных, 129

Отпечатано в издательстве
Челябинского государственного университета
454021 Челябинск, ул. Молодогвардейцев, 57б

Вам также может понравиться