Предисловие переводчика
Всем здравствуйте, вот мы и подошли к конечной части. Приятного чтения!
Навигация:
Математика многочленов
NumPy предоставляет методы для работы с полиномами. Передавая список корней, можно получить коэффициенты уравнения:
>>> np.poly([-1, 1, 1, 10])
array([ 1, -11, 9, 11, -10])
Здесь, массив возвращает коэффициенты соответствующие уравнению: .
Может быть произведена и обратная операция: передавая список коэффициентов, функция root вернет все корни многочлена:
>>> np.roots([1, 4, -2, 3])
array([-4.57974010+0.j , 0.28987005+0.75566815j,
0.28987005-0.75566815j])
Заметим, что в этом уравнении два корня мнимые.
Коэффициенты многочлена могут быть интегрированы. Рассмотрим интегрирование в . Обычно константа C равна нулю:
>>> np.polyint([1, 1, 1, 1])
array([ 0.25 , 0.33333333, 0.5 , 1. , 0. ])
Аналогично, могут быть взяты производные:
>>> np.polyder([1./4., 1./3., 1./2., 1., 0.])
array([ 1., 1., 1., 1.])
Функции polyadd, polysub, polymul и polydiv также поддерживают суммирование, вычитание, умножение и деление коэффициентов многочлена, соответственно.
Функция polyval подставляет в многочлен заданное значение. Рассмотрим многочлен при x = 4:
>>> np.polyval([1, -2, 0, 2], 4)
34
В заключение, функция polyfit может быть использована для подбора (интерполяции) многочлена заданного порядка к набору значений:
>>> x = [1, 2, 3, 4, 5, 6, 7, 8]
>>> y = [0, 2, 1, 3, 7, 10, 11, 19]
>>> np.polyfit(x, y, 2)
array([ 0.375 , -0.88690476, 1.05357143])
Возвращаемый массив это список коэффициентов многочлена. Более утонченные интерполяционные функции могут быть найдены в SciPy.
Статистика
В придачу к функциям mean, var и std, NumPy предоставляет еще некоторые методы для работы со статистическими данными в массивах.
Медиана может быть найдена так:
>>> a = np.array([1, 4, 3, 8, 9, 2, 3], float)
>>> np.median(a)
3.0
Коэффициент корреляции для некоторых переменных, наблюдается несколько раз и может быть найден из массивов вида: [[x1, x2, ...], [y1, y2, ...], [z1, z2, ...], ...], где x, y, z это разные квантовые наблюдаемые и номера указывают количество «наблюдений»:
>>> a = np.array([[1, 2, 1, 3], [5, 3, 1, 8]], float)
>>> c = np.corrcoef(a)
>>> c
array([[ 1. , 0.72870505],
[ 0.72870505, 1. ]])
Имеем возвращаемый массив c[i, j] который хранит корреляционный коэффициент для i-тых и j-тых квантовых наблюдаемых.
Аналогично, ковариационный момент может быть найден:
>>> np.cov(a)
array([[ 0.91666667, 2.08333333],
[ 2.08333333, 8.91666667]])
Случайные числа
Важная часть каждой симуляции это способность генерировать случайные числа. Для этого мы используем встроенный в NumPy генератор псевдослучайных чисел в под-модуле random. Числа являются псевдо случайными, в том плане что, они сгенерированы детерминистически из порождающего элемента (seed number), но рассредоточены в статистическом сходстве с случайным образом. Для генерации NumPy использует особенный алгоритм который имеет название Mersenne Twister.
Задать порождающий элемент последовательности случайных чисел можно так:
>>> np.random.seed(293423)
Seed это целое число. Каждая программа которая запускается с одинаковым seed`ом будет генерировать одинаковую последовательность чисел каждый раз. Это может быть полезно для отладки, но вообще нам не нужно задавать seed, на самом деле, когда мы запускаем программу несколько раз, мы хотим получать каждый раз разную последовательность чисел. Если эта команда не будет выполнена, то NumPy автоматически выбирает случайный seed (базирующийся на времени), который является разным при каждом запуске программы.
Массив случайных чисел из полуинтервала [0.0, 1.0) может быть сгенерирован так:
>>> np.random.rand(5)
array([ 0.40783762, 0.7550402 , 0.00919317, 0.01713451, 0.95299583])
Функция rand может быть использована для генерации двумерных массивов, или можно использовать функцию reshape:
>>> np.random.rand(2,3)
array([[ 0.50431753, 0.48272463, 0.45811345],
[ 0.18209476, 0.48631022, 0.49590404]])
>>> np.random.rand(6).reshape((2,3))
array([[ 0.72915152, 0.59423848, 0.25644881],
[ 0.75965311, 0.52151819, 0.60084796]])
Для генерации единичного случайного числа на интервале [0.0, 1.0):
>>> np.random.random()
0.70110427435769551
Для генерации случайного целочисленного числа в диапазоне [min, max) используем функцию randint(min, max):
>>> np.random.randint(5, 10)
9
В каждом нашем примере, мы генерировали числа из непрерывного равномерного распределения. NumPy также включает генераторы для других распределений, таких как: Бета, биномиальное, хи-квадрат, Дирихле, экспоненциальное, Фишера, Гамма, геометрическое, Гамбала, гипергеометрическое, Лапласа, логистическое, логнормальное, логарифмическое, мультиномиальное, многомерное нормальное, отрицательное биномиальное, нецентральное хи-квадрат, нецентральное Фишера, нормальное (Гаусса), Парето, Пуассона, степенное, Рэлея, Коши, Стьюдента, треугольное, Фон-Миса, Вальда, Вейбулла и Ципфа. Рассмотрим два примера.
Для генерации из дискретного распределения Пуассона при ? = 6.0,
>>> np.random.poisson(6.0)
5
Для генерации числа из нормального распределения (Гаусса) при среднем значении ? = 1.5 и стандартной девиации ? = 4.0:
>>> np.random.normal(1.5, 4.0)
0.83636555041094318
Для получении числа из нормального распределения (? = 0, ? = 1), без указания аргументов:
>>> np.random.normal()
0.27548716940682932
Для генерации нескольких значений используем аргумент size:
>>> np.random.normal(size=5)
array([-1.67215088, 0.65813053, -0.70150614, 0.91452499, 0.71440557])
Модуль для генерации случайных чисел также может быть использован для случайного распределения значений в списке. Это может быть полезно если мы хотим случайно распределить значения в списке:
>>> l = range(10)
>>> l
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> np.random.shuffle(l)
>>> l
[4, 9, 5, 0, 2, 7, 6, 8, 1, 3]
Заметим, что функция shuffle модифицирует уже существующий массив и не возвращает новый.
Некоторая дополнительная информация
NumPy включает еще много других функций о которых мы не упоминали здесь. В частности это функции для работы с дискретным преобразованием Фурье, более сложными операциями в линейной алгебре, тестированием массивов на размер / размерность / тип, разделением и соединением массивов, гистограммами, создания массивов из каких-либо данных разными путями, созданием и оперированием grid-массивов, специальными значениями (NaN, Inf), set-операции, созданием разных видов специальных матриц и вычислением специальных математических функций (Например: функции Бесселя). Также вы можете посмотреть документацию NumPy для более точных деталей.
Модули SciPy
SciPy очень хорошо расширяет функционал NumPy. Мы не будем говорить о его деталях, но рассмотрим некоторые его возможности. Большинство функций SciPy доступны после импорта модуля:
>>> import scipy
Функция help обеспечит полезной информацией о SciPy:
>>> help(scipy)
Help on package scipy:
NAME
scipy
FILE
c:\python25\lib\site-packages\scipy\__init__.py
DESCRIPTION
SciPy --- A scientific computing package for Python
===================================================
Documentation is available in the docstrings and
online at http://docs.scipy.org.
Contents
--------
SciPy imports all the functions from the NumPy namespace, and in
addition provides:
Available subpackages
---------------------
odr --- Orthogonal Distance Regression [*]
misc --- Various utilities that don't have
another home.sparse.linalg.eigen.arpack --- Eigenvalue solver using iterative methods. [*]
fftpack --- Discrete Fourier Transform algorithms[*]
io --- Data input and output [*]
sparse.linalg.eigen.lobpcg --- Locally Optimal Block Preconditioned Conjugate Gradient Method (LOBPCG) [*]
special --- Airy Functions [*]
lib.blas --- Wrappers to BLAS library [*]
sparse.linalg.eigen --- Sparse Eigenvalue Solvers [*]
stats --- Statistical Functions [*]
lib --- Python wrappers to external libraries [*]
lib.lapack --- Wrappers to LAPACK library [*]
maxentropy --- Routines for fitting maximum entropymodels [*]
integrate --- Integration routines [*]
ndimage --- n-dimensional image package [*]
linalg --- Linear algebra routines [*]
spatial --- Spatial data structures and algorithms[*]
interpolate --- Interpolation Tools [*]
sparse.linalg --- Sparse Linear Algebra [*]
sparse.linalg.dsolve.umfpack --- :Interface to the UMFPACK library: [*]
sparse.linalg.dsolve --- Linear Solvers [*]
optimize --- Optimization Tools [*]
cluster --- Vector Quantization / Kmeans [*]
signal --- Signal Processing Tools [*]
sparse --- Sparse Matrices [*]
[*] - using a package requires explicit import (see pkgload)
...
Заметим, что некоторым под-модулям нужен непосредственно дополнительный импорт, которые помечены звездой:
>>> import scipy
>>> import scipy.interpolate
Функции в каждом модуле хорошо задокументированы во внутренних docstring`ах и в официальной документации. Большинство из них непосредственно предоставляет функции для работы с числовыми алгоритмами и они очень просты в использовании. Таким образом, SciPy может сохранять гигантское количество времени в научных вычислениях, т.к. он обеспечивает уже написанные и тестированные функции.
Мы не будем рассматривать SciPy детально, но таблица ниже покроет некоторые его возможности:
Модуль | Для чего используется |
---|---|
scipy.constants | Набор математических и физических констант |
scipy.special | Много специальных функций для математической физики, такие как: Эйри, эллиптические, Бесселя, гамма, бета, гипергеометрические, параболического цилиндра, Матьё, шаровидной волны, Струве, Кельвина. |
scipy.integrate | Функции для работы с численным интегрированием используя методы трапеции, Симпсона, Ромберга и другие. Также предоставляет методы для работы с полными дифференциальными уравнениями. |
scipy.optimize | Стандартные методы поиска максимума/минимума для работы с обобщенными пользовательскими функциями. Включенные алгоритмы: Нелдера — Мида, Поулла ( Powell's), сопряженных градиентов, Бройдена — Флетчера — Гольдфарба — Шанно, наименьших квадратов, условной оптимизации, имитации отжига, полного перебора, Брента, Ньютона, бисекции, Бройдена, Андерсона и линейного поиска. |
scipy.linalg | Более широкий функционал для работы с линейной алгеброй чем в NumPy. Предоставляет больше возможностей для использования специальных и быстрых функций, для специфических объектов (Например: трёхдиагональная матрица). Включенные методы: поиск невырожденной матрицы, поиск определителя, решение линейных систем уравнений, расчета норм и псевдообратной матрицы, спектрального разложения, сингулярного разложения, LU-разложения, разложения Холецкого, QR-разложения, разложения Шура и много других математических операций для работы с матрицами. |
scipy.sparse | Функции для работы с большими разреженными матрицами |
scipy.interpolate | Методы и классы для интерполяции объектов, которые могут быть использованы для дискретных числовых данных. Линейная и сплайновая (Прим. переводчика: математическое представление плавных кривых) интерполяция доступна для одно- и двух-мерных наборов данных. |
scipy.fftpack | Методы для обработки преобразований Фурье. |
scipy.signal | Методы для обработки сигналов, например: свертка функций, корреляция, дискретное преобразование Фурье, сглаживающий B-сплайн, фильтрация, и т.д и т.п. |
scipy.stats | Большая библиотека статистических функций и распределений для работы с наборами данных. |
Послесловие
Наш цикл статей подошел к концу. Спасибо всем кто читал и уделял время. Также надеюсь, что вы вынесли какую-либо полезную информацию и научились чему-то новому. Продолжайте развиваться и узнавать новое! До скорых встреч.
Комментарии (5)
netricks
09.07.2018 17:29Матричная библиотека в numpy принципиально row-major? Или можно получить dot для column-major массивов?
KiloLeo
Примечание.
Для одного и того же списка корней существует бесконечное количество многочленов. А функция np.poly возвращает один набор коэффициентов. Все остальные многочлены семейства могут быть получены умножением массива коэффициентов на любое вещественное число.
KiloLeo
подумав немного, понял, что начиная со степени 3 множество полиномов, соответстветствующее набору корней не ограничивается умножением одного набора корней на произвольное число. Их бесконечное множество бесконечных множеств комбинаций. Но функция np.poly выдаёт лишь один набор. А что с остальными?
MechanicZelenyy
???
Все так же как и со второй степенью — любой полином представим в виде произведения a*(x-x1)*(x-x2)*… поэтому точно также домножаем на константу
homocomputeris
Любой многочлен представим как
a(x - x_1)...(x - x_n)
, где {x_k} — его корни.