2010-11-09_NumPy_SciPy_v2

advertisement
NumPy, SciPy
SciPy









— это открытая библиотека высококачественных научных
инструментов для языка программирования Python.
SciPy содержит модули для
оптимизации
интегрирования
специальных функций
обработки сигналов
обработки изображений
генетических алгоритмов
решения обыкновенных дифференциальных уравнений,
и других задач, обычно решаемых в науке и при инженерной
разработке.
Библиотека разрабатывается для той же аудитории, что
MATLAB и Scilab. Для визуализации при использовании
SciPy часто применяют библиотеку Matplotlib, являющуюся
аналогом средств вывода графики MATLAB.
МОДУЛИ
constants
Физические константы и коэффициенты пересчёта (с версии 0.7.0)
cluster
Векторное квантование
fftpack
Дискретные алгоритмы преобразования Фурье
integrate
Инструменты для интегрирования
interpolate
Инструменты для интерполяции
io
Ввод/вывод данных
lib
Врапперы Python для внешних библиотек
linalg
Линейная алгебра
misc
Разные утилиты
optimize
Средства оптимизации
sandbox
Экспериментальный код
signal
Обработка сигналов
sparse
Поддержка разреженных матриц
special
Специальные функции
stats
Статистические функции
weave
Позволяет включение кода C/C++ внутри кода Python
СТРУКТУРЫ ДАННЫХ

Основной структурой данных в SciPy является
многомерный массив, реализованный модулем
NumPy.
Более старые версии SciPy использовали для
этой цели Numeric, который сейчас заменён на
более новый NumPy
— это расширение языка Python, добавляющее
поддержку больших многомерных массивов и
матриц,
вместе
с
большой
библиотекой
высокоуровневых математических функций для
операций с этими массивами.
Сайт: http://numpy.scipy.org/
Поддерживаемые версии Python: 2.5, 2.6 (есть более старые версии,
которые поддерживают Python 2.3 и 2.4)
Документация: http://scipy.org/doc/numpy_api_docs/
НАУЧНЫЕ ВЫЧИСЛЕНИЯ В PYTHON





Работа с матрицами и векторами
Быстрое преобразование Фурье (одномерное и двумерное)
Компиляция модулей на фортране
Работа с полиномами (вычисление корней полинома,
математические операции с полиномами и т.п.)
Функции для линейной алгебры (вычисление
определителя матрицы, вычисление обратных матриц,
решение системы линейных уравнений и т.п.)
NUMERIC VS NUMARRAY VS NUMPY




Существует 3 различных реализации Numeric Python (NumPy)

Numeric – самый первый, следовательно самый
распространенный

numarray – переделка, с дополнениями

numpy – переделка, смесь первых двух, с
усовершенствованиями
Все эти пакеты имеют сходный интерфейс.
Реализационные различия:

numpy быстрее для векторных операций

Numeric – для скалярных
Все сказанное означает, что можно использовать как и numpy, так и
наиболее общий интерфейс Numerical Python, т.к. любая из трех
реализаций может быть Вами использована в последствии
МОТИВАЦИЯ

Математические алгоритмы часто работают в Python
гораздо медленнее, чем в компилируемых языках.
NumPy пытается решить эту проблему для большого
количества вычислительных алгоритмов, обеспечивая
поддержку многомерных массивов и множество
функций и операторов для работы с ними.

Альтернатива MATLAB
ЗАЧЕМ НУЖНЫ МАССИВЫ?


Векторизация (прорисовка):
массивы исключают потребность в циклах,
проходящих по их элементам
Массивы с одним индексом – вектора;
с двумя - используются для создания матриц и
представления табличной информации;
n-мерные.
работа с модулем происходит обычным образом:
from numpy import *
Конвертирование списка r в массив a происходит
привычным способом, но с помощью импортированной из
numpy функции:
a = array(r)
Для того, чтобы создать массив из n нулевых элементов
используем функцию zeros:
a = zeros(n)
Часто бывает нужно создать массив из элементов,
равномерно распределенных в интервале [p, q]. Для
этого в numpy есть функция linspace:
a = linspace(p, q, n)
ВЕКТОРИЗАЦИЯ
функция может применяться к самому массиву и производить действия над
всеми элементами
И даже сложные составные выражения
r = sin(x)*cos(x)*exp(-x**2) + 2 + x**2
подвластны волшебству массивов:
r = zeros(len(x))
for i in xrange(len(x)):
r[i] = sin(x[i])*cos(x[i])*exp(-x[i]**2) + 2 + x[i]**2
+



существенный выигрыш в скорости по сравнению со списками
существенно повышает скорость обработки
делает код более понятным и ясным для чтения
РАБОТА С МАТРИЦАМИ
Два класса - array и matrix.
Различия в некоторых операциях над
экземплярами классов:
оператор * для array производит поэлементное
перемножение хранимых в матрице величин. А
для перемножения матриц по правилам
линейной алгебры есть метод dot.
import numpy
# Создание матрицы
a = numpy.array ([[1, 2, 3], [4, 5, 6], [7, 8, 9]], "f")
print a
>>>
[[ 1. 2. 3.]
[ 4. 5. 6.]
[ 7. 8. 9.]]
# Создадим единичную матрицу размера 3 x 3. Матрица будет
хранить числа с плавающей точкой.
a = numpy.ones ([3,3], "f")
print a
>>>
[[ 1. 1. 1.]
[ 1. 1. 1.]
[ 1. 1. 1.]]
b = numpy.ones ([3,3], "f")
b *= 2
print b
>>>
[[ 2. 2. 2.]
[ 2. 2. 2.]
[ 2. 2. 2.]]
c=a+b
print c
>>>
[[ 3. 3. 3.]
[ 3. 3. 3.]
[ 3. 3. 3.]]
ПЕРЕМНОЖЕНИЕ МАТРИЦ И ИХ ЭЛЕМЕНТОВ
a = numpy.array ([[1, 2, 3], [4, 5, 6]], "f")
print a
>>>
[[ 1. 2. 3.]
[ 4. 5. 6.]]
b = numpy.array ([[0, 1, 2], [4, -1, 1]], "f")
print b
>>> [[ 0. 1. 2.]
[ 4. -1. 1.]]
# Поэлементное перемножение
c1 = a * b
print c1
>>> [[ 0. 2. 6.]
[ 16. -5. 6.]]
# Транспонирование матрицы
bt = b.T
print bt
>>> [[ 0. 4.]
[ 1. -1.]
[ 2. 1.]]
# Перемножение матриц
c2 = numpy.dot(a, bt)
print c2
>>> [[ 8. 5.]
[ 17. 17.]]
УДОБНО ВЫДЕЛЯТЬ ЧАСТИ МАТРИЦ
a = numpy.array ([[1, 2, 3], [4, 5, 6], [7, 8, 9]], "f")
print a
>>> [[ 1. 2. 3.]
[ 4. 5. 6.]
[ 7. 8. 9.]]
tmp = a[:, 0]
print tmp
>>> [ 1. 4. 7.]
tmp2 = a[0:2, 1:3]
print tmp2
>>> [[ 2. 3.]
[ 5. 6.]]
# Так же работает присваивание
a = numpy.zeros([3, 3], "f")
print a
>>> [[ 0. 0. 0.]
[ 0. 0. 0.]
[ 0. 0. 0.]]
a[:, 0] = [n for n in range(3)]
print a
>>> [[ 0. 0. 0.]
[ 1. 0. 0.]
[ 2. 0. 0.]]
ИНТЕГРИРОВАНИЕ
import scipy
from scipy.integrate import quad
def integrand(t,n,x):
return n*x*t
def expint(n,x):
return quad(integrand, 1, 4, args=(n, x))[0]
print expint(2,1)
>>>
15.0
ОПТИМИЗАЦИЯ
from scipy.optimize import fmin
def rosen(x):
"""The Rosenbrock function"""
return sum(100.0*(x[1:]-x[:-1]**2.0)**2.0 + (1-x[:-1])**2.0)
x0 = [1.3, 0.7, 0.8, 1.9, 1.2]
xopt = fmin(rosen, x0, xtol=1e-8)
print xopt
>>>
Optimization terminated successfully.
Current function value: 0.000000
Iterations: 339
Function evaluations: 571
[ 1. 1. 1. 1. 1.]
Download