NumPy, SciPy
это открытая библиотека высококачественных научных инструментов для языка программирования Python. SciPy содержит модули для оптимизации интегрирования специальных функций обработки сигналов обработки изображений генетических алгоритмов решения обыкновенных дифференциальных уравнений, и других задач, обычно решаемых в науке и при инженерной разработке. Библиотека разрабатывается для той же аудитории, что MATLAB и Scilab. Для визуализации при использовании SciPy часто применяют библиотеку Matplotlib, являющуюся аналогом средств вывода графики MATLAB. SciPy
М ОДУЛИ 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, добавляющее поддержку больших многомерных массивов и матриц, вместе с большой библиотекой высокоуровневых математических функций для операций с этими массивами. Сайт: Поддерживаемые версии Python: 2.5, 2.6 (есть более старые версии, которые поддерживают Python 2.3 и 2.4) Документация:
Н АУЧНЫЕ ВЫЧИСЛЕНИЯ В P YTHON Работа с матрицами и векторами Быстрое преобразование Фурье (одномерное и двумерное) Компиляция модулей на фортране Работа с полиномами (вычисление корней полинома, математические операции с полиномами и т.п.) Функции для линейной алгебры (вычисление определителя матрицы, вычисление обратных матриц, решение системы линейных уравнений и т.п.)
N UMERIC 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 ) x** 2 подвластны волшебству массивов: r = zeros( len (x)) for i in xrange ( len (x)): r[i] = sin(x[i])*cos(x[i])*exp(-x[i]** 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 >>> [[ ] [ ] [ ]]
# Создадим единичную матрицу размера 3 x 3. Матрица будет хранить числа с плавающей точкой. a = numpy.ones ([3,3], "f") print a >>> [[ ] [ ] [ ]] b = numpy.ones ([3,3], "f") b *= 2 print b >>> [[ ] [ ] [ ]] c = a + b print c >>> [[ ] [ ] [ ]]
П ЕРЕМНОЖЕНИЕ МАТРИЦ И ИХ ЭЛЕМЕНТОВ a = numpy.array ([[1, 2, 3], [4, 5, 6]], "f") print a >>> [[ ] [ ]] b = numpy.array ([[0, 1, 2], [4, -1, 1]], "f") print b >>> [[ ] [ ]] # Поэлементное перемножение c1 = a * b print c1 >>> [[ ] [ ]] # Транспонирование матрицы bt = b.T print bt >>> [[ 0. 4.] [ ] [ 2. 1.]] # Перемножение матриц c2 = numpy.dot(a, bt) print c2 >>> [[ 8. 5.] [ ]]
У ДОБНО ВЫДЕЛЯТЬ ЧАСТИ МАТРИЦ a = numpy.array ([[1, 2, 3], [4, 5, 6], [7, 8, 9]], "f") print a >>> [[ ] [ ] [ ]] tmp = a[:, 0] print tmp >>> [ ] tmp2 = a[0:2, 1:3] print tmp2 >>> [[ 2. 3.] [ 5. 6.]] # Так же работает присваивание a = numpy.zeros([3, 3], "f") print a >>> [[ ] [ ] [ ]] a[:, 0] = [n for n in range(3)] print a >>> [[ ] [ ] [ ]]
И НТЕГРИРОВАНИЕ 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: Iterations: 339 Function evaluations: 571 [ ]