На главную страницу | Новости  |  Ссылки | Контакты

Spyphy Farnsworth
Квантовая реальность. Кибернетика. Искусственный интеллект


Введение в Python, часть 3. Расширения языка: модули и пакеты


Рассмотрим в первую очередь библиотеки NumPy, которая обычно используется для работы с матрицами.

Модули


До сих пор рассматривались только функции и классы, входящие непосредственно в ядро языка Python. Их использование не требует подключения каких-либо внешних библиотек. Однако для получения большей функциональности возникает необходимость подключения (импортирования) внешних модулей. Для этого служит ключевое слово import.

Например, модуль math содержит набор математических функций (sqrt, abs, exp, log, тригонометрические функции и др.). Чтобы использовать эти функции в своей программе, необходимо импортировать модуль math:

 #code: Использование модуля math
>>> import math
>>> math.pi		# число пи
3.141592653589793
>>> math.cos(math.pi)  # вычисляем косинус числа пи
-1.0
 

При импорте модуля можно задать для него псевдоним (исключительно для удобства) с помощью ключевого слова as, что позволит затем использовать псевдоним при обращении к атрибутам модуля. Например,

 #code: Использование модуля math
>>> import math as m
>>> m.cos(m.pi)
-1.0
 

Часто полезно импортировать не весь модуль, а лишь отдельные его атрибуты (имена функций, классов и т.п.). Для этого служит инструкция from. Кроме того, после такого импорта для вызова функции достаточно указать только ее имя (без имени модуля):

>>> from math import cos, pi
>>> pi
3.141592653589793
>>> cos(pi)
-1.0
 

Существуют специальная форма инструкции from, которая позволяет импортировать сразу все атрибуты модуля:

>>> from math import *

Однако такой подход не всегда оправдан, так как часто приводит к <<замусориванию>> пространства имен.

%Инструкции импорта не обязательно должны находится в начала всей программы, они могут идти непосредственно перед первым использованием требуемых функций.

Фактически модули в Python представляют собой просто файлы с исходным кодом либо байт-кодом (причем не обязательно написанных на языке Python). Несколько модулей могут быть помещены в отдельный каталог. Такой каталог называет пакетом. При этом полный путь к функции будет выглядеть примерно так: пакет.модуль.функция.

Замечание. Для сравнения, в C++ для доступа к методу класса используется оператор точка, а для доступа к функциям библиотек --- оператор двойного двоеточия (::). В Python нет существенной разницы между модулями и классами, и поэтому в обоих случаях используется оператор точка.

NumPy


Библиотека NumPy расширяет возможности языка Python и предназначена для работы с матрицами (класс matrix) и другими объектами линейной алгебры, в частности обеспечивает поддержку больших многомерных массивов (класс ndarray). По сути библиотека NumPy представляет собой пакет (набор) модулей, где каждый модуль --- это отдельный файл. Библиотека не входит в стандартный набор, поставляемый с интерпретатором Python, и поэтому требует отдельной установки.

Начнем с рассмотрения матриц. Следующий пример демонстрирует создание матрицы размера 2 на 2 и ее вывода на консоль.

>>> import numpy as np
>>> A = np.matrix([[1,2],[3,4]])
>>> print(A)
[[1 2]
 
[3 4]]

С точки зрения ООП написанное здесь можно понимать следующим образом. Во второй строчке происходит создание экземпляра класса matrix (из пакета numpy), причем в конструктор класса передаем стандартный ``питоновский'' список, из которого и формируется ``матрица'' A.

После того, как матрица создана, над ней можно производить различные операции. Например, можно вычеслить квадрат этой матрицы:

>>> B = A**2
>>> print(B)
[[ 7 10]
 
[15 22]]

Заметим, что для новой матрицы B нет необходимости явно вызывать конструктор. Он будет вызыван автоматически.

Аналогичным образом можно перемножать, складывать и вычитать матрицы, а также умножать матрицы на числа и т.п. (все эти операции уже перегружены в классе matrix).

Для более сложных вычислений над матрицами, например нахождения обратной матрицы, необходимо импортировать модуль linalg пакета numpy, либо отдельные фукнции из него. Например,

>>> from numpy.linalg import inv
>>> print(inv(A))  # вычисление обратной матрицы
[[-2.   1. ]
 
[ 1.5 -0.5]]

%Полным именем этой функции было бы numpy.linalg.inv, т.е. сначала указывается имя пакета (библиотека numpy), затем имя модуля (т.е. файла) в этого пакете, и затем имя функции.

Класс ndarray


Как уже было сказано, NumPy реализует поддержку больших многомерных массивов. Класс многомерных массивов называется ndarray. (Он отличается от класса array стандартной библиотеки Python, который используется только для одномерных массивов).

Пример:


[[ 1., 0., 0.],

[ 0., 1., 2.]]

Атрибуты объектов ndarray:

- ndarray.ndim --- число осей (измерений) массива;

- ndarray.shape --- размеры массива, его форма;

- ndarray.size --- число всех элементов массива;

- ndarray.dtype --- объект, описывающий тип элементов массива;

- ndarray.itemsize --- размер каждого элемента массива в байтах.

- ndarray.data --- буфер, содержащий фактические элементы массива;


array() --- функция, создающая объект типа ndarray --- эта функция трансформирует вложенные последовательности в многомерные массивы:

По умолчанию тип создаваемого массива --- float64. Но его можно изменить с помощью dtype.

 #code: Создание массивов
import numpy as np
a = np.array([1, 2, 3])
b = np.array([[1.5, 2, 3], [4, 5, 6]])
c = np.array([[1.5, 2, 3], [4, 5, 6]], dtype=np.complex)

Стандартные массивы:

- np.zeros((nx, ny)) --- создает массив из нулей,

- np.ones((nx, ny, nz)) --- массив из единиц.

- eye(n) --- единичная матрица (двумерный массив);

- empty() --- массив без заполнения;

arange() --- для создания последовательностей чисел (аналогична встроенной функции range(), только вместо списков она возвращает массивы).

 #code: Последовательности
np.arange(10, 30, 5)
array([10, 15, 20, 25])

Графическая библиотека matplotlib


Matplotlib --- это библиотека двумерной графики для Python, которая позволяет создавать высококачественные рисунки различных форматов. В последних версиях включена также поддержка трехмерной графики. Библиотека позволяет выводить на экран различные графические примитивы, такие как графики функций, гистограммы и т.п. По сути это объектно-ориентированное API над графическими библиотеками wxPython, Qt и GTK+.

Рассматриваемые ниже библиотеки для работы с графами используют внутри себя функции из Мatplotlib для формирования изображений графов. Явно нам понадобится вызывать только функцию show() этой библиотеки, если мы хотим вывести рисунок на экран, либо функцию savefig() для сохранения рисунка в файл.





galaxy