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.]