Слайд 1Москва, 2018
Информационные
технологии
Основы
программирования
на Python 3
Каф. ИКТ РХТУ им.
Д.И. Менделеева
Ст. преп. Васецкий А.М.
Слайд 2Лекция 7.
Введение в
библиотеки Python
Матрицы
Библиотеки
Слайд 3Библиотеки-1
Библиотека численных методов NumPy
NumPy.linalg (Линейная алгебра);
NumPy.random (Случайные числа);
NumPy (Раздел «Индексация»
(Indexing routines));
NumPy (Раздел «Ввод и вывод» (Input and output);
NumPy (Разделы
строковых и логических операций);
NumPy (Разделы операций с массивами);
NumPy (Раздел математических функций);
NumPy (Разделы сортировки и поиска);
Библиотека алгоритмов и математических инструментов SciPy
SciPy.linalg (Линейная алгебра);
SciPy.integrate (Интегрирование и решение обыкновенных дифференциальных уравнений);
SciPy.stats (Статистические функции);
SciPy.optimize (Оптимизация);
SciPy.interpolate (Интерполяция);
Слайд 4Библиотеки-2
Blaze – численные методы для больших данных;
Pandas – библиотека обработки
данных;
Fuzzywuzzy – библиотека сравнения данных;
matplotlib – построение графиков;
Seaborn – визуализация
статистических моделей;
Altair – визуализация данных;
Glueviz – визуализация данных;
Pyglet – 3D-анимация;
Vpython – 3D-графика;
Plotly – библиотека работы с графикой;
Pillow – библиотека работы с графикой;
Gnuplot – библиотека работы с графическими изображениями;
PyX – библиотека работы с графическими изображениями, PDF и Postscript;
geopy – библиотека для геолокации;
Requests – HTTP библиотека;
Urllib и Urllib2 – работа с Интернет;
BeautifulSoup – XML и HTML библиотека;
Scrapy – библиотека для парсинга сайта;
Django – Web-фреймворк;
Flask – Web-фреймворк;
Слайд 5Библиотеки-3
wxPython – пользовательский интерфейс;
Tkinter – пользовательский интерфейс;
pyQT – пользовательский интерфейс;
pyGtk
– пользовательский интерфейс;
pywin32 – библиотека взаимодействия с Windows;
Nose – среда
тестирования;
Nltk – работа со строками и пр.;
ParaText – библиотека для обработки текста;
SymPy – библиотека для символьных вычислений;
ChemPy – библиотека химических расчётов;
SciKit-Learn – инструмент для обработки изображений и имитации искусственного интеллекта;
Theano – библиотека, которая используется для разработки систем машинного обучения;
PyCrypto – криптографическая библиотека;
mxODBC – библиотека для связи с базами данных;
pyGame – библиотека для написания игровых приложений;
pyQuery – аналог библиотеки jquery для работы с XML и HTML документами;
Модули сериализации и десериализации данных (pickle, json, csv, yaml и др.)
Слайд 6Введение в NumPy
NumPy – фундаментальный пакет для научных вычислений с
Python. В нём содержатся:
Мощный объект N-мерного массива.
сложные функции.
Инструментарий для интеграции
с кодом на языках C/C++ и Fortran.
Линейная алгебра, трансформации Фурье, случайные числа.
Кроме того, данный пакет может быть использован как многомерный контейнер общих данных. Произвольные типы данных могут быть определены. Это позволяет NumPy легко и быстро интегрироваться с широким спектром баз данных.
Слайд 7Ошибка multiarray
В pyCharm отмечено наличие ошибки при установке numpy
и некоторых других библиотек:
ImportError:
Importing the multiarray numpy extension module failed.
Most
likely you are trying to import a failed build of numpy.
If you're working with a numpy git repo, try `git clean -xdf` (removes all
files not under version control). Otherwise reinstall numpy.
Original error was: DLL load failed: The specified module could not be found.
Слайд 8Устранение ошибки multiarray
Ошибка связана с переменной среды PATH.
Самый простой
способ её устранить, это переустановить Anaconda и поставить флажок в
первое поле.
В переменную среды PATH добавятся пути к папкам Anaconda:
d:\ProgramData\Anaconda3;d:\ProgramData\Anaconda3\Library\mingw-w64\bin;
d:\ProgramData\Anaconda3\Library\usr\bin;
d:\ProgramData\Anaconda3\Library\bin;d:\ProgramData\Anaconda3\Scripts
Для проверки правильности работы библиотеки наберите:
import numpy as np
print(np.__version__)
Слайд 9Основные разделы NumPy-1
Создание массивов
Операции с массивами
Бинарные (побитовые) операции
Строковые операции
Функции даты
и времени
Дискретная трансформация Фурье
Финансовые функции
Функциональное программирование
Процедуры индексации
Ввод/вывод
Слайд 10Основные разделы NumPy-2
Линейная алгебра
Логические функции
Маскированные операции с массивами
Математические функции
Матричные функции
Полиномы
Случайные
числа
Сортировка
Статистика
Оконные функции
Слайд 13Массивы
Библиотека NumPy обеспечивает эффективный интерфейс для хранения и работы с
плотными буферами данных. Массивы в ней похожи на встроенный тип
данных "список" (list) языка Python, но обеспечивают гораздо более эффективное хранение и операции с данными при росте размера массивов.
Кроме того срезы массивов возвращают представления (views), а не копии (copies) данных массива. Этим срезы массивов NumPy отличаются от срезов списков так как в списках срезы являются копиями.
На уровне реализации массив фактически содержит один указатель на непрерывный блок данных. Список же в языке Python содержит указатель на блок указателей, каждый из которых, в свою очередь, указывает на целый объект языка Python, например, на целое число.
Массивам с фиксированным типом из библиотеки NumPy проигрывают спискам в гибкости, однако гораздо эффективнее хранят данные и работают с ними.
Слайд 14Создание массивов
Существуют следующие основные способы создания массивов
Преобразование из других структур
Python (списки, кортежи и т.п.)
Внутренние объекты создания массивов numpy (arange,
ones, zeros, и т.п.)
Чтение массивов с диска, как из стандартных, так и из пользовательских форматов
Создание массивов из "сырых" байтов с использованием строк или буферов
Использование специальных библиотечных функций (например, random)
Слайд 15Создание массивов
Встроенный модуль array (доступен с версии 3.3 Python) можно
использовать для создания плотных массивов данных одного типа:
import array
L =
list(range(5))
A = array.array('i', L) # array('i', [0, 1, 2, 3, 4])
'i' – код типа, указывающий, что содержимое является целыми числами.
Можно напрямую задавать массивы через NumPy:
import numpy as np
A = np.array([1, 0, -2, 4, 3]) # [ 1 0 -2 4 3]
B = np.array([0, 1, 2, 3], dtype='float32')
# [0. 1. 2. 3.]
Слайд 16Многомерные массивы
Вложенные списки преобразуются в многомерный массив
B = np.array([range(i, i
+ 3) for i in [0, 2, 4]])
# [[0 1
2]
# [2 3 4]
# [4 5 6]]
Можно использовать одновременно списки и кортежи
B = np.array([[1,2.0],[0,0],(1+1j,3.)])
# [[1.+0.j 2.+0.j]
# [0.+0.j 0.+0.j]
# [1.+1.j 3.+0.j]]
Слайд 18Примеры инициализации - 1
B = np.zeros(5, dtype=int) # [0 0
0 0 0]
B = np.ones((2, 3), dtype=float)
#[[1. 1. 1.]
# [1.
1. 1.]]
B = np.empty([3, 2], dtype=int)
# Внутри В может находиться что угодно
# Работает быстрее, чем методы с
# инициализацией
# [[-512881756 2046]
# [-512880032 2046]
# [ 0 0]]
B = ([1,2,3], [4,5,6]) # В – массив-шаблон
A = np.empty_like(B)
# Внутри А может находиться что угодно
#[[2982 0 0]
# [ 0 0 0]]
Слайд 19Примеры инициализации - 2
B = np.eye(2, dtype=int)
# Единичная целочисленная
матрица
# [[1 0]
# [0 1]]
B = np.eye(2, 3, dtype=int) #
Матрица 2×3
# [[1 0 0]
# [0 1 0]]
B = np.eye(3, k=1)
# Матрица с наддиагональными единичными элементами
# [[0. 1. 0.]
# [0. 0. 1.]
# [0. 0. 0.]]
Слайд 20Примеры инициализации - 3
B = np.identity(2)
# Единичная матрица типа
float (по умолчанию)
# [[1. 0.]
# [0. 1.]]
B = np.full((2, 3),
np.inf) # заполнение
# [[inf inf inf]
# [inf inf inf]]
A = np.full_like(B, 7) # Заполнение аналога В
# [[7. 7. 7.]
# [7. 7. 7.]]
Слайд 21Атрибуты массивов
Основным объектом NumPy является однородный многомерный массив numpy.ndarray элементов
одного типа.
атрибуты объектов ndarray:
['T', …, 'all', 'any', 'argmax', 'argmin', 'argpartition',
'argsort', 'astype', 'base', 'byteswap', 'choose', 'clip', 'compress', 'conj', 'conjugate', 'copy', 'ctypes', 'cumprod', 'cumsum', 'data', 'diagonal', 'dot', 'dtype', 'dump', 'dumps', 'fill', 'flags', 'flat', 'flatten', 'getfield', 'imag', 'item', 'itemset', 'itemsize', 'max', 'mean', 'min', 'nbytes', 'ndim', 'newbyteorder', 'nonzero', 'partition', 'prod', 'ptp', 'put', 'ravel', 'real', 'repeat', 'reshape', 'resize', 'round', 'searchsorted', 'setfield', 'setflags', 'shape', 'size', 'sort', 'squeeze', 'std', 'strides', 'sum', 'swapaxes', 'take', 'tobytes', 'tofile', 'tolist', 'tostring', 'trace', 'transpose', 'var', 'view']
Слайд 22Наиболее важные атрибуты массивов
Слайд 23Примеры
A = np.array([[1,2],[3,4]])
[[1 2]
[3 4]]
B = A.T # Транспонирование
[[1
3]
[2 4]]
A.nbytes # 16 – байт
A.ndim # 2 – размерность
A.shape # (2, 2) – форма
A.size # 4 – количество элементов
Слайд 24Создание массивов из существующих данных
Слайд 25Примеры создания массивов
A = np.fromstring("1 2", dtype=int, sep=" ") #
[1 2]
А = np.array([1, 2, 3]) # [1 2 3]
A
= np.array([[1., 2], [0, 3]]) # [[1. 2.]
# [0. 3.]]
B = np.array(A, copy=True)
print(A is B) # False
D = np.array(A, copy=False)
print(A is D) # True
D[0, 0] = 7
print(A) # [[7. 2.]
# [0. 3.]]
print(B) # [[1. 2.]
# [0. 3.]]
print(D) # [[7. 2.]
# [0. 3.]]
F = np.copy(A) # [[7. 2.]
# [0. 3.]]
Слайд 26Создание массивов с использованием функций
A = np.fromfunction(lambda i, j: i
== j, (3, 3), dtype=int) # Массив размерности 3×3
#
dtype – тип данных координат, подаваемых в функцию
# [[ True False False]
# [False True False]
# [False False True]]
A = np.fromfunction(lambda i, j: i*10 + j, (3, 3), dtype=int)
# [[ 0 1 2]
# [10 11 12]
# [20 21 22]]
Слайд 27Создание массивов при помощи последовательностей
Слайд 28Примеры создания массивов с использованием последовательностей
it = (x*x for x
in range(5)) # итератор
A = np.fromiter(it, float) # [ 0.
1. 4. 9. 16.]
A = np.arange(3.) # [0. 1. 2.]
A = np.arange(0,10,3) # [0 3 6 9]
A = np.linspace(0.0, 4, num=5) # [0. 1. 2. 3. 4.]
A = np.logspace(1, 5, num=5)
# array([1.e+01, 1.e+02, 1.e+03, 1.e+04, 1.e+05])
B = np.log10(A) # [1. 1.75 2.5 3.25 4. ]
A = np.geomspace(1, 4, num=5)
# [1. 1.41421356 2. 2.82842712 4. ]
Слайд 29meshgrid для построения графиков
import matplotlib.pyplot as plt
x = np.arange(-10, 10,
0.1)
y = np.arange(-10, 10, 0.1)
xx, yy = np.meshgrid(x, y, sparse=True)
z
= np.sin(xx**2 + yy**2)
h = plt.contourf(x,y,z)
plt.show()
Подробнее см. https://docs.scipy.org/doc/numpy/reference/routines.array-creation.html
Слайд 30Доступ к элементам массива
В целом доступ и индексация аналогичны спискам.
A
= np.arange(10) # [0 1 2 3 4 5 6 7
8 9]
A[:2] # [0 1]
A[::-1] # [9 8 7 6 5 4 3 2 1 0]
A = np.array([[1, 5, 3, 0],
[7, 2, 8, 1],
[1, 6, 3, 7]])
B = A[:2, :3] # две строки и три столбца
# [[1 5 3]
# [7 2 8]]
Не забудьте, что В, это НЕ копия!
Поэтому присваивание B[0, 0] = 9
B: [[9 5 3] отразится и на А: [[9 5 3 0]
[7 2 8]] [7 2 8 1]
[1 6 3 7]]
Слайд 31Базовые операции с массивами
Математические операции над массивами выполняются поэлементно.
a =
np.array([0, -1, -2, -3])
b = np.arange(4)
c = a + b #
array([0, 0, 0, 0])
c = a / b # array([nan, -1., -1., -1.])
c = a + 1 # array([ 1, 0, -1, -2])
c = a < 0 # array([False, True, True, True])
Слайд 33Примеры операций с массивами
Помимо метода copy (см. выше) можно копировать
массивы при помощи метода copyto
A = np.array([[1, 2, 3],
[11, 12, 13]])
B = np.empty_like(A)
# Массив В той же размерности, что и А
np.copyto(B, A) # B: [[1, 2, 3],
[11, 12, 13]])
np.ravel(A) # [ 1 2 3 11 12 13]
A.reshape(-1) # [ 1 2 3 11 12 13]
Фортрановский стиль хранения:
np.ravel(A, order='F') # [ 1 11 2 12 3 13]
A.flat[4] # 12
Слайд 34Примеры операций с массивами
A = np.arange(6).reshape((2, 3)) # [[0 1
2]
# [3 4 5]]
B = np.transpose(A) # [[0 3]
# [1
4]
# [2 5]]
C = A.T # [[0 3]
# [1 4]
# [2 5]]
A = np.ones((2, 3, 4))
A.shape # Размерности = (2, 3, 4)
np.moveaxis(x, -1, 0).shape
# Переместить последнюю ось на 0 позицию
# (4, 2, 3)
Слайд 36Примеры операций с массивами
A = [1, 2]
B = np.asarray(A) # [1
2]
A is B # False
a = np.array([1, 2])
np.asarray(a) is a # True
x
= np.array([[1, 2], [3, 4]])
m = np.asmatrix(x)
x[0, 1] = 8 # [[1 8]
# [3 4]]
Слайд 37Примеры слияния массивов
a = np.array([[1, 2], [3, 4]])
b = np.array([[10,
11]])
c = np.concatenate((a, b), axis=0) # [[ 1 2]
# [ 3
4]
# [10 11]]
d = np.concatenate((a, b.T), axis=1) # [[ 1 2 10]
# [ 3 4 11]]
e = np.concatenate((a, b), axis=None)
# [ 1 2 3 4 10 11]
Слайд 39Примеры разделения массивов
x = np.arange(12.0) # [ 0. 1. 2.
… 7. 8. 9. 10. 11.]
np.split(x, 3) # [array([0., 1.,
2., 3.]), array([4., 5., 6., 7.]), array([ 8., 9., 10., 11.])]
Если индекс секции представляет собой 1-мерный массив целых чисел, то его элементы показывают точки разбиения. Например, [2, 3] для axis=0 дадут разбиение:
ary[:2]
ary[2:3]
ary[3:]
np.split(x, [2, 3])
# [array([0., 1.]),
array([2.]),
array([ 3., 4., 5., 6., 7., 8., 9., 10., 11.])]
Слайд 40Размножение элементов массивов
a = np.array([0, 1, 2])
np.tile(a, 3) # [0 1
2 0 1 2 0 1 2]
b = np.array([[1, 2],
[3, 4]])
c= np.tile(b, 2) # [[1 2 1 2]
# [3 4 3 4]]
a= np.repeat(2, 3) # [2 2 2]
c = np.repeat(b, 3, axis=1) # [[1 1 1 2 2 2]
# [3 3 3 4 4 4]]
c = np.repeat(b, 3, axis=0) # [[1 2]
# [1 2]
# [1 2]
# [3 4]
# [3 4]
# [3 4]]
Слайд 41Вставка и удаление элементов; переразмеривание массивов
Слайд 42Примеры вставки и удаления-1
a = np.array([[1,2,3,4], [5,6,7,8], [9,10,11,12]])
# array([[ 1,
2, 3, 4],
# [ 5, 6, 7,
8],
# [ 9, 10, 11, 12]])
b = np.delete(a, 1, 0) # array([[ 1, 2, 3, 4],
# [ 9, 10, 11, 12]])
a = np.array([[1,2], [3,4], [5,6]]) # array([[1, 2],
# [3, 4],
# [5, 6]])
b = np.insert(a, 1, 0) # array([1, 0, 2, 3, 4, 5, 6])
c = np.insert(a, 1, 7, axis=1) # array([[1, 7, 2],
# [3, 7, 4],
#[5, 7, 6]])
Слайд 43Примеры вставки и удаления-2
a = [1, 2, 3]
d = np.append(a,
[[4, 5, 6], [7, 8, 9]])
# array([1, 2, 3, 4,
5, 6, 7, 8, 9])
a = np.array([[1, 2], [3, 4], [5, 6]])
Добавляем строку (ось 0)
e = np.append(a, [[7, 8]], axis=0) # array([[1, 2],
# [3, 4],
# [5, 6],
# [7, 8]])
также см. метод concatenate
Слайд 44Примеры преобразований массивов
a=np.array([[0, 1], [10, 11]])
c = np.resize(a, (2, 4)) #
array([[ 0, 1, 10, 11],
#
[ 0, 1, 10, 11]])
a =np.arange(6).reshape((3, 2)) # array([[0, 1],
# [2, 3],
# [4, 5]])
Отражение по строке (ось 0)
b = np.flip(a, 0) # array([[4, 5],
# [2, 3],
# [0, 1]])
Отражение по столбцу (ось 1)
b = np.flip(a, 1) # array([[1, 0],
# [3, 2],
# [5, 4]])
Слайд 45Примеры прокрутки массивов
a = np.arange(10) #array([0, 1, 2, 3, 4,
5, 6, 7, 8, 9])
b = np.roll(a, 2) #array([8, 9, 0,
1, 2, 3, 4, 5, 6, 7])
b = np.reshape(a, (2, 5)) # array([[0, 1, 2, 3, 4],
# [5, 6, 7, 8, 9]])
c = np.roll(b, 1) # array([[9, 0, 1, 2, 3],
# [4, 5, 6, 7, 8]])
Строки:
c = np.roll(b, 1, axis=0) # array([[5, 6, 7, 8, 9],
# [0, 1, 2, 3, 4]])
Столбцы:
c = np.roll(b, 2, axis=1) # array([[3, 4, 0, 1, 2],
# [8, 9, 5, 6, 7]])
Слайд 46Примеры нахождения уникальных элементов
Уникальные элементы
a = np.array([[0, 1], [1, 7]])
b
= np.unique(a) # array([0, 1, 7])
Уникальные строки
a = np.array([[1, 0, 0],
[1, 0, 0], [2, 3, 4]])
b = np.unique(a, axis=0) # array([[1, 0, 0],
# [2, 3, 4]])
Уникальные столбцы
a = np.array([ [1, 1, 0],
[1, 1, 0],
[2, 2, 4]])
b = np.unique(a, axis=1) # array([[0, 1],
[0, 1],
[4, 2]])
Слайд 47Операции ввода и вывода
Документацию по форматам файлов см. numpy.lib.format
Слайд 54Математические функции-3
Остальные математические функции https://docs.scipy.org/doc/numpy/reference/routines.math.html
Слайд 55Библиотека SciPy
https://docs.scipy.org/doc/scipy/reference/
Специальные функции (scipy.special)
Функции Бесселя
Интегрирование (scipy.integrate)
Оптимизация (scipy.optimize)
Интерполяция (scipy.interpolate)
Преобразования Фурье
(scipy.fftpack)
Обработка сигналов (scipy.signal)
Линейная алгебра (scipy.linalg)
Статистика (scipy.stats)
Многомерная обработка изображений (scipy.ndimage)
Файловый ввод-вывод
(scipy.io)
Слайд 60Ограничения
Ограничения передаются, чтобы минимизировать функцию как отдельный объект или как
список объектов из следующих классов:
NonlinearConstraint(fun, lb, ub [, jac,…]) –
Нелинейное ограничение на переменные.
LinearConstraint (A, lb, ub [, keep_feasible]) –Линейное ограничение на переменные.
Простые связанные ограничения обрабатываются отдельно, и для них есть специальный класс:
Bounds(lb, ub [, keep_feasible]) – Ограничение границ для переменных.
Слайд 62Нахождение корней нелинейных уравнений
Слайд 63Нахождение корней-2
См. остальные функции раздела https://docs.scipy.org/doc/scipy/reference/optimize.html#module-scipy.optimize
Слайд 64Модуль pickle
Модуль pickle реализует мощный алгоритм сериализации и десериализации
Pickling –
процесс преобразования объекта Python в поток байтов (сериализация), а unpickling
– обратная операция (десериализация), в результате которой поток байтов преобразуется обратно в Python-объект. Поток байтов легко можно записать в файл и модуль pickle широко применяется для сохранения и загрузки сложных объектов в Python.
Слайд 65С чем работает модуль pickle
Какие типы данных Pickle умеет запаковывать?
None, True, False
Строки (обычные или Unicode)
Стандартные числовые типы данных
Словари, списки,
кортежи
Функции
Классы
Слайд 67Пример записи/считывания
d = {"a": [1, 2.0, 3, 4+6j],
"b": ("строка", b"byte string"),
"c": {None, True, False}
}
fil = "dt.pickle"
with open(fil, "wb") as f:
pickle.dump(d, f)
with open(fil, "rb") as f:
d_new = pickle.load(f)
print(d_new)
# {'a': [1, 2.0, 3, (4+6j)], 'b': ('строка', b'byte string'), 'c': {False, True, None}}
Внимание! Не загружайте pickle-файлы из неавторизованных источников!
Документация https://docs.python.org/3/library/pickle.html