Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Практическое программирование на Python. Учебное пособие

.pdf
Скачиваний:
1
Добавлен:
08.09.2026
Размер:
2 Мб
Скачать
☆
3.4. Модуль Decimal
Рассмотрим простой пример: программа, которая складывает два числа.
a = float(input('a = ')) b = float(input('b = ')) c = a+b print('a+b = ', c)
В основном такая программа работает корректно:
a = 4.1 b = 7.9 a+b = 12.0
Но в ряде случаев возможны проблемы, обусловленные особен­ностями представления вещественных чисел в двоичном виде:
a = 3.3 b = 4.1 a+b = 7.3999999999999995
Модуль decimal позволяет устранить недостатки, которые иногда возникают при работе с встроенными числами типа float.
from decimal import * a = Decimal('3.3') b = Decimal('4.1') print(a+b)
В этом случае результат будет корректен:
7.4
Числа типа float имеют фиксированную точность, в то время как числа типа Decimal – настраиваемую:
print(float(7**0.5))
getcontext().prec = 5 print(Decimal(7).sqrt())
getcontext().prec = 25 print(Decimal(7).sqrt())
41
Результат будет следующий:
2.6457513110645907
2.6458
2.645751311064590590501616
3.5. Библиотека NumPy
NumPy – это библиотека языка Python, добавляющая поддержку больших многомерных массивов и матриц, вместе с большой биб­лиотекой высокоуровневых математических функций для операций с этими массивами.
3.5.1. Массивы
В NumPy существует много способов создать массив. Один из наиболее простых – создать массив из обычных списков или кортежей
Python, используя функцию numpy.array():
import numpy as np a = np.array([1, 2, 3]) print(a) print(type(a))
Важно помнить что array() – это функция, создающая объект типа ndarray.
Функция array() трансформирует вложенные последовательности в многомерные массивы. Тип элементов массива зависит от типа элементов исходной последовательности
b = np.array([[1.5, 2, 3], [4, 5, 6]]) print(b)
Можно также переопределить тип в момент создания:
c = np.array([[1.5, 2, 3], [4, 5, 6]], dtype=np.complex) print(c)
Для создания последовательностей чисел, в NumPy имеется функция arange(), аналогичная
встроенной в Python range(), только вместо списков она возвращает массивы и принимает не только целые значения:
t = np.arange(0, 1, 0.1) print(t)
42
Вообще, при использовании arange() с аргументами типа float, сложно быть уверенным в том, сколько элементов будет получено (из-за ограничения точности чисел с плавающей запятой). Поэтому, в таких случаях обычно лучше использовать функцию linspace(), которая вместо шага в качестве одного из аргументов принимает число, равное количеству нужных элементов:
x = np.linspace(0, 2, 9)
# 9 чисел
от 0 до 2 включительно
print(x)
3.5.2. Случайные числа
В библиотеке NumPy есть функция для генерации случайных чисел:
a = np.random.sample() print(a)
С помощью этой функции можно сгенерировать массив случайных чисел, например, таким способом: задав количество чисел, которые мы хотим получить.
q = np.random.sample(3) print(q)
Также можно генерировать и двумерные массивы (матрицы):
q = np.random.sample((2, 3)) print(q)
Без аргументов случайные числа генерируются в диапазоне
от 0 до 1.
С помощью функции randint можно создать массив из целых чисел. У этих функций задается три параметра:
● Low – от какого числа генерировать;
● High – до какого числа (randint не включает в себя это число);
● Size – размеры массива.
a1 = np.random.randint(0, 3, 10) print(a1)
Аналогичным образом генерируются и двумерные массивы (матрицы)
a2 = np.random.randint(0, 3, (2, 10)) print(a2)
43
3.5.3. Математические операции
Для работы с массивами в библиотеке реализованы стандартные функции: суммирование, определение максимума и другие.
q = np.random.sample(5) print(q) print(q.min()) print(q.max()) print(q.sum())
Также есть функция округления, в которую в качестве параметра передается количество требуемых знаков после запятой:
t = np.random.sample(5) print(t) print(np.around(t, 2))
С массивами можно работать, применяя арифметические операции как между массивами, так и между массивом и числом
. Например, помножим все элементы первого массива на 4, а потом сложим с другим массивом (массивы, конечно, должны быть одинакового размера):
a = np.array([1, 2, 3]) b = np.array([56, 3, 1]) a = a*4 print(a) c = a+b print(c)
Такая работа с массивами имеет смысл, если представить, что
массив – это математический вектор.
3.5.4. Файлы
Библиотека NumPy предоставляет возможность сохранять и загру-
жать массивы из файла. При этом от
пользователя скрыты детали этой операции, а сами файлы хранятся в двоичном виде, что делает невоз­можным их просмотр обычными текстовыми редакторами файлов.
import numpy as np a = np.random.randint(0, 3, 10) np.save('MyFile_Data', a) b = np.load('MyFile_Data.npy') print(b)
44
Файлы .npy удобны для хранения одного массива, если в одном файле нужно сохранить несколько массивов, то необходимо восполь­зоваться функцией numpy.savez(), которая сохранит их в несжатом виде в файле NumPy с форматом .npz.
Также существует способ сохранение массивов в текстовые файлы:
import numpy as np a = np.random.randint(0, 3, 10) np.savetxt('MyFile.txt', a, fmt='%d') b = np.loadtxt('MyFile.txt', dtype=int) print(b)
3.6. Библиотека SciPy
SciPy – это библиотека Python с открытым исходным кодом,
предна­значенная для решения научных и математических проблем. Она построена на базе NumPy и позволяет управлять данными, а также визуализировать их с помощью разных высокоуровневых команд. Если вы импортируете SciPy, то NumPy отдельно импортировать не нужно.
И NumPy, и SciPy являются библиотеками Python, которые исполь-
зуются для математического и числового анализов. NumPy
содержит данные массивов и операции, такие как сортировка, индексация, а SciPy состоит из числового кода. И хотя в NumPy есть функции для работы с линейной алгеброй, преобразованиями Фурье и т. д., в SciPy они представлены в полном виде вместе с массой других. А для полно­ценного научного анализа в Python нужно
устанавливать и NumPy,
и SciPy, поскольку последняя построена на базе NumPy.
В SciPy есть набор пакетов для разных научных вычислений:
● cluster алгоритмы кластерного анализа;
● constants физические и математические константы;
● fftpack быстрое преобразование Фурье;
● integrate решения интегральных и дифференциальных
уравнений;
● interpolate интерполяция и сглаживание сплайнов;
● io ввод и вывод;
● linalg линейная алгебра;
● optimize оптимизация и численное решение уравнений;
● signal обработка сигналов;
● sparse разреженные матрицы;
● stats статистические распределения и функции.
45
Анализ Фурье – это метод, который помогает представлять функцию в виде суммы периодических компонентов и восстанавли­вать сигнал из них. Функции fft используются для получения дис­кретной трансформации Фурье реальной или комплексной последо­вательности.
import numpy as np from scipy.fftpack import fft, ifft
x = np.array([0,1,2,3]) y1 = fft(x) print(y1) y1 = ifft(x) print(y1)
Результат будет следующий:
[ 6.+0.j -2.+2.j -2.+0.j -2.-2.j] [ 1.5+0.j -0.5-0.5j -0.5+0.j -0.5+0.5j]
3.7. Библиотека SymPy
SymPy – это библиотека Python для выполнения символьных вычислений. Это система
компьютерной алгебры, которая может выступать как отдельное приложение, так и в качестве библиотеки для других приложений.
В SymPy есть разные функции, которые применяются в сфере символьных вычислений, математического анализа, алгебры, дискрет­ной математики, квантовой физики и т. д. SymPy может представлять результат в разных форматах: LaTeX, MathML и других.
Наиболее наглядным выглядит
сравнение выводов при исполь-
зовании математической и символьной библиотек.
import math import sympy print(math.sqrt(3), math.sqrt(12)) print(sympy.sqrt(3), sympy.sqrt(12))
В случае с модулем math вернется число, а вот в SymPy – формула.
1.7320508075688772 3.4641016151377544
sqrt(3) 2*sqrt(3)
46
3.7.1. Числа
Основной модуль в SymPy включает класс Number, представ­ляющий атомарные числа. У него есть пара подклассов: Float и Rational. В Rational также входит Integer.
Наиболее часто используются классы Float (представляет числа с плавающей точкой произвольной точности) и Integer (целое число любого размера):
a=Rational(3, 5) # 3/5 print(a) b = Integer(4) print(b)
3.7.2. Символы
Symbol – самый важный
класс в библиотеке SymPy. Как уже упо­миналось ранее, символьные вычисления выполняются с помощью символов. И переменные SymPy являются объектами класса Symbol.
Аргумент функции Symbol() – это строка, содержащая символ,
который можно присвоить переменной.
from sympy import Symbol x = Symbol('x') y = Symbol('y') expr = x**2 + y**2 print(expr)
3.7.3. Подстановка параметров
Одна из базовых операций в математических выражениях – подста-
новка. Функция subs() заменяет все случаи
первого параметра на второй.
Рассмотрим пример, в котором создадим формулу:
from sympy import * x = Symbol('x') expr = x**2 + 2*x + 5 print(expr)
А затем произведем замену в выражении, подставив вместо x
значение 5:
print(expr.subs(x,5))
Результатом будет вычисленное значение выражения: 40
47
3.7.4. Simplify()
Функция simplify() используется для преобразования любого произвольного выражения, чтобы его можно было использовать как выражение SymPy. Обычные объекты Python, такие как целые числа, конвертируются в SymPy.Integer и т. д. Строки также конвертируются в выражения SymPy:
expr = "x**2 + 3*x + 2" expr1 = sympify(expr) print(expr1) print(expr1.subs(x, 2))
Результатом будет: x**2 + 3*x + 2
12
3.7.5. Evalf()
Рассмотрим формулу, которая использует стандартную кон­станту π:
r = Symbol('r') Formula = pi * r**2 print(Formula)
При попытке произвести вычисление, подставив значение пере­менной r:
print(Formula.subs(r, 5))
Результатом будет: 25*pi
Функция evalf() вычисляет данное числовое выражение с точно­стью до 100 цифр после плавающей точки. Она также принимает параметр subs, как объект словаря с числовыми значениями для символов. Например, такое выражение:
print(Formula.evalf(subs={r: 5}))
И в таком случае ответом будет: 78.5398163397448
По умолчанию точность после плавающей точки – 15, но это значение можно перезаписать до 100. Следующее выражение вычисляет, используя вплоть до 20 цифр точности:
print(Formula.evalf(20, subs={r: 5}))
И в таком случае ответом будет: 78.539816339744830962
48
3.7.6. Lambdify()
Функция lambdify() переводит выражения SymPy в функции Python. Если выражение, которое нужно вычислить, затрагивает диапазон зна­чений, то функция evalf() становится неэффективной. Функция lambdify действует как лямбда-функция с тем исключением, что она конвертирует
SymPy в имена данной числовой библиотеки, обычно NumPy.
Formula =1/sin(x) Func = lambdify(x, Formula) print(Func(3.14))
У выражения может быть больше одной переменной.
В таком случае первым аргументом функции является список переменных, а после него – само выражение:
a = Symbol('a') b = Symbol('b') NewFormula = a**2 + b**2 NewFunc = lambdify([a, b], NewFormula) print(NewFunc(2, 3))
3.8. Библиотека matplotlib
Matplotlib – библиотека на языке программирования Python для визуа­лизации данных двумерной графикой. Получаемые изображения могут быть использованы в качестве иллюстраций в публикациях. Matplotlib состоит из множества модулей. Модули наполнены различными классами и функциями, которые
иерархически связаны между собой.
Matplotlib является гибким, легко конфигурируемым пакетом, который вместе с NumPy, SciPy и IPython предоставляет возможности, подобные MATLAB. В настоящее время пакет работает с несколькими графическими библиотеками, включая wxWindows и PyGTK.
Пакет поддерживает многие виды графиков и диаграмм:
● графики (line plot);
● диаграммы разброса (scatter plot);
● столбчатые диаграммы (bar chart) и гистограммы (histogram);
● круговые диаграммы (pie chart);
● ствол-лист диаграммы (stem plot);
● контурные графики (contour plot);
● поля градиентов (quiver);
● спектральные диаграммы (spectrogram);
49
Пользователь может указать оси координат, решетку, добавить надписи и пояснения, использовать логарифмическую шкалу или полярные координаты.
3.8.1. Pylab
Pylab – это модуль внутри библиотеки matplotlib, который был встроен для подражания общего стиля MATLAB. Он существует только для внесения ряда функций классов из NumPy и matplotlib в пространство имен, что упрощает переход пользователей MATLAB, которые
не сталкивались с необходимостью в операторах импорта.
Приведем пример построение графика функции cos(х) по 10 точкам:
from pylab import * x = arange(10) y = cos(x) plot(x, y) show()
Важно отметить, что pylab все еще существует по историческим причинам, но его использование не рекомендуется. Он перегружает пространства имен функциями, которые оттеняют надстройки Python и может привести к скрытым багам. Для получения интеграции
IPython без использования импортов, рекомендуется использовать matplotlib.
3.8.2. Графики Pyplot
Модуль pyplot – это коллекция функций в стиле команд, которая позволяет использовать matplotlib почти так же, как MATLAB. Каждая функция pyplot работает с объектами Figure и позволяет их изменять. Например, есть функции для создания объекта Figure, для создания области построения, представления линии, добавления метки и т. д.
Если не указывать явно, то график возьмет настройку функции plt.plot() по умолчанию:
● размер осей соответствует диапазону введенных данных;
● у осей нет ни меток, ни заголовков;
● легенды нет;
● соединяющая точки линия – синяя.
50
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]