NumPy в Python. Часть 4

в 10:30, , рубрики: arrays, numpy, python, python3, перевод с английскогою

Предисловие переводчика

Всем здравствуйте, вот мы и подошли к конечной части. Приятного чтения!
Навигация:

Математика многочленов

NumPy предоставляет методы для работы с полиномами. Передавая список корней, можно получить коэффициенты уравнения:

>>> np.poly([-1, 1, 1, 10])
array([ 1, -11,   9,  11, -10])

Здесь, массив возвращает коэффициенты соответствующие уравнению: $x^4 - 11x^3 + 9x^2 + 11x - 10$.
Может быть произведена и обратная операция: передавая список коэффициентов, функция root вернет все корни многочлена:

>>> np.roots([1, 4, -2, 3])
array([-4.57974010+0.j        ,  0.28987005+0.75566815j,
        0.28987005-0.75566815j])

Заметим, что в этом уравнении $x^3 + 4x^2 - 2x + 3$ два корня мнимые.
Коэффициенты многочлена могут быть интегрированы. Рассмотрим интегрирование $x^3 + x^2 + x + 1$ в $x^4/4 + x^3/3 + x^2/2 + x + C$. Обычно константа 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^3 - 2x^2 + 2$ при 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:python25libsite-packagesscipy__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 Большая библиотека статистических функций и распределений для работы с наборами данных.

Большая группа разработчиков непрерывно продолжает разрабатывать новый функционал SciPy. Хороший практический подход это: если вы думаете о реализации каких-либо числовых функций и методов в вашем коде, можете сначала заглянуть в оригинальную документацию SciPy. Есть вероятность того, что это уже кто-то реализовал и внес в SciPy.

Послесловие

Наш цикл статей подошел к концу. Спасибо всем кто читал и уделял время. Также надеюсь, что вы вынесли какую-либо полезную информацию и научились чему-то новому. Продолжайте развиваться и узнавать новое! До скорых встреч.

Автор: rainbowpenguin

Источник

Поделиться

* - обязательные к заполнению поля