Роман Сузи - Язык программирования Python
В этой таблице в качестве обозначения типа type можно указывать рассмотренные выше константы: Int, Float и т.п.
Модуль Numeric также определяет константы e (число e) и pi (число пи).
Модуль LinearAlgebra
Модуль LinearAlgebra содержит алгоритмы линейной алгебры, в частности нахождение определителя матрицы, решений системы линейных уравнений, обращение матрицы, нахождение собственных чисел и собственных векторов матрицы, разложение матрицы на множители: Холецкого, сингулярное, метод наименьших квадратов.
Функция LinearAlgebra.determinant() находит определитель матрицы:
>>> import Numeric, LinearAlgebra
>>> print LinearAlgebra.determinant(
... Numeric.array([[1, -2],
... [1, 5]]))
7
Функция LinearAlgebra.solve_linear_equations() решает линейные уравнения вида ax=b по заданным аргументам a и b:
>>> import Numeric, LinearAlgebra
>>> a = Numeric.array([[1.0, 2.0], [0.0, 1.0]])
>>> b = Numeric.array([1.2, 1.5])
>>> x = LinearAlgebra.solve_linear_equations(a, b)
>>> print "x =", x
x = [-1.8 1.5]
>>> print "Проверка:", Numeric.dot(a, x) - b
Проверка: [ 0. 0.]
Когда матрица a имеет нулевой определитель, система имеет не единственное решение и возбуждается исключение LinearAlgebraError:
>>> a = Numeric.array([[1.0, 2.0], [0.5, 1.0]])
>>> x = LinearAlgebra.solve_linear_equations(a, b)
Traceback (most recent call last):
File "<stdin>", line 1, in ?
File "/usr/local/lib/python2.3/site–packages/Numeric/LinearAlgebra.py", line 98,
in solve_linear_equations raise LinAlgError, 'Singular matrix'
LinearAlgebra.LinAlgError: Singular matrix
Функция LinearAlgebra.inverse() находит обратную матрицу. Однако не следует решать линейные уравнения с помощью LinearAlgebra.inverse() умножением на обратную матрицу, так как она определена через LinearAlgebra.solve_linear_equations():
def inverse(a):
return solve_linear_equations(a, Numeric.identity(a.shape[0]))
Функция LinearAlgebra.eigenvalues() находит собственные значения матрицы, а LinearAlgebra.eigenvectors() — пару: собственные значения, собственные вектора:
>>> from Numeric import array, dot
>>> from LinearAlgebra import eigenvalues, eigenvectors
>>> a = array([[-5, 2], [2, — 7]])
>>> lmd = eigenvalues(a)
>>> print "Собственные значения:", lmd
Собственные значения: [-3.76393202–8.23606798]
>>> (lmd, v) = eigenvectors(a)
>>> print "Собственные вектора:"
Собственные вектора:
>>> print v
[[ 0.85065081 0.52573111]
[-0.52573111 0.85065081]]
>>> print "Проверка:", dot(a, v[0]) - v[0] * lmd[0]
Проверка: [ -4.44089210e–16 2.22044605e–16]
Проверка показывает, что тождество выполняется с достаточно большой точностью (числа совсем маленькие, практически нули): собственные числа и векторы найдены верно.
Модуль RandomArray
В этом модуле собраны функции для генерации массивов случайных чисел различных распределений и свойств. Их можно применять для математического моделирования.
Функция RandomArray.random() создает массивы из псевдослучайных чисел, равномерно распределенных в интервале (0, 1):
>>> import RandomArray
>>> print RandomArray.random(10) # массив из 10 псевдослучайных чисел
[ 0.28374212 0.19260929 0.07045474 0.30547682 0.10842083 0.14049676
0.01347435 0.37043894 0.47362471 0.37673479]
>>> print RandomArray.random([3,3]) # массив 3x3 из псевдослучайных чисел
[[ 0.53493741 0.44636754 0.20466961]
[ 0.8911635 0.03570878 0.00965272]
[ 0.78490953 0.20674807 0.23657821]]
Функция RandomArray.randint() для получения массива равномерно распределенных чисел из заданного интервала и заданной формы:
>>> print RandomArray.randint(1, 10, [10])
[8 1 9 9 7 5 2 5 3 2]
>>> print RandomArray.randint(1, 10, [10])
[2 2 5 5 7 7 3 4 3 7]
Можно получать и случайные перестановки с помощью RandomArray.permutation():
>>> print RandomArray.permutation(6)
[4 0 1 3 2 5]
>>> print RandomArray.permutation(6)
[1 2 0 3 5 4]
Доступны и другие распределения для получения массива нормально распределенных величин с заданным средним и стандартным отклонением:
>>> print RandomArray.normal(0, 1, 30)
[-1.0944078 1.24862444 0.20415567 -0.74283403 0.72461408 -0.57834256
0.30957144 0.8682853 1.10942173 -0.39661118 1.33383882 1.54818618
0.18814971 0.89728773 -0.86146659 0.0184834 -1.46222591 -0.78427434
1.09295738 -1.09731364 1.34913492 -0.75001568 -0.11239344 2.73692131
-0.19881676 -0.49245331 1.54091263 -1.81212211 0.46522358 -0.08338884]
Следующая таблица приводит функции для других распределений:
Функция и ее аргументы Описание F(dfn, dfd, shape=[]) F–распределение beta(a, b, shape=[]) Бета–распределение binomial(trials, p, shape=[]) Биномиальное распределение chi_square(df, shape=[]) Распределение хи–квадрат exponential(mean, shape=[]) Экспоненциальное распределение gamma(a, r, shape=[]) Гамма–распределение multivariate_normal(mean, cov, shape=[]) Многомерное нормальное распределение negative_binomial(trials, p, shape=[]) Негативное биномиальное noncentral_F(dfn, dfd, nconc, shape=[]) Нецентральное F–распределение noncentral_chi_square(df, nconc, shape=[]) Нецентральное хи–квадрат распределение normal(mean, std, shape=[]) Нормальное распределение permutation(n) Случайная перестановка poisson(mean, shape=[]) Пуассоновское распределение randint(min, max=None, shape=[]) Случайное целое random(shape=[]) Равномерное распределение на интервале (0, 1) random_integers(max, min=1, shape=[]) Случайное целое standard_normal(shape=[]) Стандартное нормальное распределение uniform(min, max, shape=[]) Равномерное распределениеЗаключение
В этой лекции рассматривался набор модулей для численных вычислений. Модуль Numeric определяет тип многомерный массив и множество функций для работы с массивами. Также были представлены модули для линейной алгебры и моделирования последовательностей случайных чисел различных распределений.
Ссылки
Сайт, посвященный Numeric Python: http://www.pfdubois.com/numpy/
Лекция #6: Обработка текстов. Регулярные выражения. Unicode.
В этой лекции дается краткое представление о возможностях языка Python по обработке текстовой информации. Рассмотрены синтаксис и семантика регулярных выражений, а также некоторые вопросы использования Unicode.
Под обработкой текстов понимается анализ, преобразование, поиск, порождение текстовой информации. По большей части работа с естественными текстами не будет глубже, чем это возможно без систем искусственного интеллекта. Кроме того, здесь предполагается опустить рассмотрение обработки текстов посредством текстовых процессоров и редакторов, хотя некоторые из них (например, Cooledit) предоставляют возможность писать макрокоманды на Python.
Следует отметить, что для Python созданы также модули для работы с естественными языками, а также для лингвистических исследований. Хорошим учебным примером может служить nltk (the Natural Language Toolkit).
Стоит отметить проект PyParsing (сайт:http://pyparsing.sourceforge.net), с помощью которого можно организовать обработку текста по заданной грамматике.
Строки
Строки в языке Python являются типом данных, специально предназначенным для обработки текстовой информации. Строка может содержать произвольно длинный текст (ограниченный имеющейся памятью).
В новых версиях Python имеются два типа строк: обычные строки (последовательность байтов) и Unicode–строки (последовательность символов). В Unicode–строке каждый символ может занимать в памяти 2 или 4 байта, в зависимости от настроек периода компиляции. Четырехбайтовые знаки используются в основном для восточных языков.
Примечание:В языке и стандартной библиотеке за некоторыми исключениями строки и Unicode–строки взаимозаменяемы, в собственных приложениях для совместимости с обоими видами строк следует избегать проверок на тип. Если это необходимо, можно проверять принадлежность базовому (для строк и Unicode–строк) типу с помощью isinstance(s, basestring).
При использовании Unicode–строк, следует мысленно принять точку зрения, относительно которой именно Unicode–представление является главным, а все остальные кодировки — лишь частные случаи представления текста, которые не могут передать всех символов. Без такой установки будет непонятно, почему преобразование из восьмибитной кодировки называется decode (декодирование). Для внешнего представления можно с успехом использовать кодировку UTF–8, хотя, конечно, это зависит от решаемых задач.