Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Практическое программирование на Python. Учебное пособие
.pdf
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
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
