К книге
Язык программирования PythonЛекция #5: Численные алгоритмы. Матричные вычисления.. Модуль Numeric. Универсальные функции
49%
Лекция #5: Численные алгоритмы. Матричные вычисления.. Модуль Numeric. Универсальные функции
112

Модуль Numeric определяет набор функций для применения к элементам массива. Функции применимы не только к массивам, но и к последовательностям (к сожалению, итераторы пока не поддерживаются). В результате получаются массивы.

Перечисленные функции являются объектами типа ufunc и применяются к массивам поэлементно. Эти функции имеют специальные методы:

Пример с функцией add() позволяет понять смысл универсальной функции и ее методов:

>>> from Numeric import add

>>> add([[1, 2], [3, 4]], [[1, 0], [0, 1]])

array([[2, 2],

       [3, 5]])

>>> add([[1, 2], [3, 4]], [1, 0])

array([[2, 2],

       [4, 4]])

>>> add([[1, 2], [3, 4]], 1)

array([[2, 3],

       [4, 5]])

>>> add.reduce([1, 2, 3, 4])        # т.е. 1+2+3+4

10

>>> add.reduce([[1, 2], [3, 4]], 0) # т.е. [1+3 2+4]

array([4, 6])

>>> add.reduce([[1, 2], [3, 4]], 1) # т.е. [1+2 3+4]

array([3, 7])

>>> add.accumulate([1, 2, 3, 4])    # т.е. [1 1+2 1+2+3 1+2+3+4]

array([ 1, 3, 6, 10])

>>> add.reduceat(range(10), [0, 3, 6]) # т.е. [0+1+2 3+4+5 6+7+8+9]

array([ 3, 12, 30])

>>> add.outer([1,2], [3,4])         # т.е. [[1+3 1+4] [2+3 2+4]]

array([[4, 5],

       [5, 6]])

Методы accumulate(), reduce() и reduceat() принимают необязательный аргумент — номер размерности, используемой для соответствующего действия. По умолчанию применяется нулевая размерность.

Универсальные функции, помимо одного или двух необходимых параметров, позволяют задавать и еще один аргумент, для приема результата функции. Тип третьего аргумента должен строго соответствовать типу результата. Например, функция sqrt() даже от целых чисел имеет тип Float.

>>> from Numeric import array, sqrt, Float

>>> a = array([0, 1, 2])

>>> r = array([0, 0, 0], Float)

>>> sqrt(a, r)

array([ 0. , 1. , 1.41421356])

>>> print r

[ 0. 1. 1.41421356]

Предупреждение:

Не следует использовать в качестве приемника результата массив, который фигурирует в предыдущих аргументах функции, так как при этом результат может быть испорчен. Следующий пример показывает именно такой вариант:

>>> import Numeric

>>> m = Numeric.array([0, 0, 0, 1, 0, 0, 0, 0])

>>> add(m[:-1], m[1:], m[1:])

array([0, 0, 1, 1, 1, 1, 1])

В таких неоднозначных случаях необходимо использовать промежуточный массив.

Предыдущая главаГлава 112 из 230Следующая глава