Пакеты NumPy ( http://numpy.scipy.org ) и SciPy ( http://www.scipy.org) являются двумя наиболее известными расширениями языка Python для проведения научных расчетов.
Пакет Numpy включает модули для эффективной работы с многомерными массивами, матрицами, функции для генерации псевдослучайных чисел, функции, реализующие алгоритмы линейной алгебры, преобразование Фурье, возможности интеграции программ на языках С и Фортран.
Пакет SciPy базируется на пакете NumPy и расширяет его возможности. Например, включает модули для численного интегрирования, статистического анализа, решения обыкновенных дифференциальных уравнений, обработки сигналов и изображений, оптимизационные алгоритмы,… .
Далее рассмотрим подробнее некоторые возможности пакета NumPy.
NumPy добавляет в Python поддержку большого количества новых числовых типов: bool (True или False); int (целые числа, int32 или int64); int8 (целые цисла от -128 до 127); int16 (целые числа -32768 до 32767); int32 (целые числа от -2147483648 до 2147483647); int64 (целые числа от 9223372036854775808 до 9223372036854775807); uint8 (целые числа без знака от 0 до 255); uint16 (целые числа без знака 0 до 65535); uint32 (целые числа без знака 0 до 4294967295); uint64 (целые числа без знака 0 до 18446744073709551615); float (краткая форма для float64); float32 (вещественные числа одинарной точности); float64 (вещественные числа двойной точности ); complex (краткая форма для complex128); complex64 (комплексные числа, действительная и мнимая части представлены числами типа float32); complex128 (комплексные числа, действительная и мнимая части представлены числами типа float64).
Одним из основных объектов NumPy является ndarray. Он позволяет создавать многомерные массивы данных одного типа и выполнять операции над ними с большой скоростью. В отличие от последовательностей в Python, массивы в NumPy имеют фиксированный размер, элементы массива должны быть одного типа. К массивам можно применять различные математические операции, которые выполняются более эффективно, чем для последовательностей Python.
>>> import numpy
>>> a = numpy.array([1, 2, 3]) #массив целых чисел
>>> print a
[1 2 3]
>>> b = numpy.array([1, 2, 3.0]) #массив действительных чисел
>>> print b
[ 1. 2. 3.]
>>> c = numpy.array([1, 2, 3.0+2j]) #массив комплексных чисел
>>> print c
[ 1.+0.j 2.+0.j 3.+2.j]
>>>
Размерность массива можно определить с помощью атрибута shape, тип элементов — с помощью dtype.
>>> import numpy
>>> d = numpy.array([[1, 2, 3], [3, 4, 5]])
>>> print d
[[1 2 3]
[3 4 5]]
>>> d.shape
(2, 3)
>>> d.dtype
dtype('int32')
>>> type(d)
<type 'numpy.ndarray'>
>>>
При создании массива можно явно указать тип его элементов
>>> import numpy
>>> e = numpy.array([[1, 2, 3], [3, 4, 5]], dtype=float)
>>> e
array([[ 1., 2., 3.],
[ 3., 4., 5.]])
>>>
В NumPy присутствуют встроенные функции для создания массивов специального вида. Функция arange() возвращает массив чисел с увеличивающимися значениями.
>>> import numpy
>>> numpy.arange(10)
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> numpy.arange(1, 10, 2)
array([1, 3, 5, 7, 9])
>>> numpy.arange(1, 10, 2, dtype=float)
array([ 1., 3., 5., 7., 9.])
>>>
Функция linspace() возвращает массив из n элементов на заданном отрезке, с одинаковым расстоянием между элементами. По умолчанию n=50.
>>> import numpy
>>> numpy.linspace(0, 5, 3)
array([ 0. , 2.5, 5. ])
>>> numpy.linspace(0, 5, 6)
array([ 0., 1., 2., 3., 4., 5.])
>>>
Функция zeros() возвращает массив, состоящий из нулей.
>>> import numpy
>>> numpy.zeros((3, 3))
array([[ 0., 0., 0.],
[ 0., 0., 0.],
[ 0., 0., 0.]])
>>> numpy.zeros((3, 3), dtype=int)
array([[0, 0, 0],
[0, 0, 0],
[0, 0, 0]])
>>>
Функция ones() возвращает массив, состоящий из единиц.
>>> import numpy
>>> numpy.ones((3, 3))
array([[ 1., 1., 1.],
[ 1., 1., 1.],
[ 1., 1., 1.]])
Функция identity() возвращает массив, состоящий из единиц.
>>> import numpy
>>> numpy.identity(3)
array([[ 1., 0., 0.],
[ 0., 1., 0.],
[ 0., 0., 1.]])
>>>
Функция dot(a,b) возвращает произведение массивов, linalg.det(a) — вычисляет определитель массива a, linalg.inv(a) — возвращает обратную матрицу к матрице a, linalg.solve(a,b) — возвращает решение системы линейных алгебраических уравнений. Для создания матриц в NumPy существует специальный класс matrix, унаследованный от ndarray. Объекты matrix всегда являются двумерными. Для создания объектов matrix можно использовать Matlab-подобный синтаксис (столбы разделяются пробелами, строки — ;). Вместо matrix можно использовать сокращение mat. В отличие от ndarray, произведение объектов matrix является обычным произведением матриц. Атрибут .T позволяют найти транспонированную матрицу, .I — обратную матрицу.
>>> import numpy
>>> a = numpy.matrix('1 0;0 1')
>>> b = numpy.matrix('1 2;3 4')
>>> a
matrix([[1, 0],
[0, 1]])
>>> b
matrix([[1, 2],
[3, 4]])
>>> a*b
matrix([[1, 2],
[3, 4]])
>>> b.T
matrix([[1, 3],
[2, 4]])
>>> b.I
matrix([[-2. , 1. ],
[ 1.5, -0.5]])
>>>