351 likes | 1.03k Views
NumPy , SciPy. SciPy. — это открытая библиотека высококачественных научных инструментов для языка программирования Python . SciPy содержит модули для оптимизации интегрирования специальных функций обработки сигналов обработки изображений генетических алгоритмов
E N D
SciPy — это открытая библиотека высококачественных научных инструментов для языка программирования Python. SciPy содержит модули для • оптимизации • интегрирования • специальных функций • обработки сигналов • обработки изображений • генетических алгоритмов • решения обыкновенных дифференциальных уравнений, • и других задач, обычно решаемых в науке и при инженерной разработке. • Библиотека разрабатывается для той же аудитории, что MATLAB и Scilab. Для визуализации при использовании SciPy часто применяют библиотеку Matplotlib, являющуюся аналогом средств вывода графики MATLAB.
Структуры данных • Основной структурой данных в 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 • Работа с матрицами и векторами • Быстрое преобразование Фурье (одномерное и двумерное) • Компиляция модулей на фортране • Работа с полиномами (вычисление корней полинома, математические операции с полиномами и т.п.) • Функции для линейной алгебры (вычисление определителя матрицы, вычисление обратных матриц, решение системы линейных уравнений и т.п.)
Numericvsnumarrayvsnumpy • Существует 3 различных реализации NumericPython (NumPy) • Numeric – самый первый, следовательно самый распространенный • numarray – переделка, с дополнениями • numpy – переделка, смесь первых двух, с усовершенствованиями • Все эти пакеты имеют сходный интерфейс. • Реализационные различия: • numpy быстрее для векторных операций • Numeric – для скалярных • Все сказанное означает, что можно использовать как и numpy, так и наиболее общий интерфейс NumericalPython, т.к. любая из трех реализаций может быть Вами использована в последствии
Мотивация • Математические алгоритмы часто работают в Python гораздо медленнее, чем в компилируемых языках. NumPy пытается решить эту проблему для большого количества вычислительных алгоритмов, обеспечивая поддержку многомерных массивов и множество функций и операторов для работы с ними. • Альтернатива MATLAB
Зачем нужны массивы? • Векторизация (прорисовка): массивы исключают потребность в циклах, проходящих по их элементам • Массивы с одним индексом – вектора; с двумя - используются для создания матриц и представления табличной информации; n-мерные.
работа с модулем происходит обычным образом: fromnumpyimport* Конвертирование списка 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)) foriinxrange(len(x)): r[i] = sin(x[i])*cos(x[i])*exp(-x[i]**2) + 2 + x[i]**2 + • существенный выигрыш в скорости по сравнению со списками • существенно повышает скорость обработки • делает код более понятным и ясным для чтения
Работа с матрицами Два класса - array и matrix. Различия в некоторых операциях над экземплярами классов: оператор * для array производит поэлементное перемножение хранимых в матрице величин. А для перемножения матриц по правилам линейной алгебры есть метод dot.
importnumpy# Создание матрицы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")printa >>> [[ 1. 1. 1.] [ 1. 1. 1.] [ 1. 1. 1.]] b = numpy.ones ([3,3], "f")b *= 2print b >>> [[ 2. 2. 2.] [ 2. 2. 2.] [ 2. 2. 2.]] c = a + bprint 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 * bprint c1 >>>[[ 0. 2. 6.] [ 16. -5. 6.]]# Транспонирование матрицыbt= b.Tprintbt >>>[[ 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]printtmp >>>[ 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 inrange(3)]print a >>>[[ 0. 0. 0.] [ 1. 0. 0.] [ 2. 0. 0.]]
Интегрирование importscipy fromscipy.integrateimport quad defintegrand(t,n,x): return n*x*t defexpint(n,x): return quad(integrand, 1, 4, args=(n, x))[0] printexpint(2,1) >>> 15.0
Оптимизация fromscipy.optimizeimportfmin defrosen(x): """The Rosenbrock function""" returnsum(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) printxopt >>> Optimization terminated successfully. Current function value: 0.000000 Iterations: 339 Function evaluations: 571 [ 1. 1. 1. 1. 1.]