Универсальные функции
Модуль Numeric определяет набор функций для применения к элементам массива. Функции применимы не только к массивам, но и к последовательностям (к сожалению, итераторы пока не поддерживаются). В результате получаются массивы.
add(x, y), subtract(x, y) | Сложение и вычитание |
multiply(x, y), divide(x, y) | Умножение и деление |
remainder(x, y), fmod(x, y) | Получение остатка от деления (для целых чисел и чисел с плавающей запятой) |
power(x, y) | Возведение в степень |
sqrt(x) | Извлечение корня квадратного |
negative(x), absolute(x), fabs(x) | Смена знака и абсолютное значение |
ceil(x), floor(x) | Наименьшее (наибольшее) целое, большее (меньшее) или равное аргументу |
hypot(x, y) | Длина гипотенузы (даны длины двух катетов) |
sin(x), cos(x), tan(x) | Тригонометрические функции |
arcsin(x), arccos(x), arctan(x) | Обратные тригонометрические функции |
arctan2(x, y) | Арктангенс от частного аргумента |
sinh(x), cosh(x), tanh(x) | Гиперболические функции |
arcsinh(x), arccosh(x), arctanh(x) | Обратные гиперболические функции |
exp(x) | Экспонента (ex) |
log(x), log10(x) | Натуральный и десятичный логарифмы |
maximum(x, y), minimum(x, y) | Максимум и минимум |
conjugate(x) | Сопряжение (для комплексных чисел) |
equal(x, y), not_equal(x, y) | Равно, не равно |
greater(x, y), greater_equal(x, y) | Больше, больше или равно |
less(x, y), less_equal(x, y) | Меньше, меньше или равно |
logical_and(x, y), logical_or(x, y) | Логические И, ИЛИ |
logical_xor(x, y) | Логическое исключающее ИЛИ |
logical_not(x) | Логические НЕ |
bitwise_and(x, y), bitwise_or(x, y) | Побитовые И, ИЛИ |
bitwise_xor(x, y) | Побитовое исключающее ИЛИ |
invert(x) | Побитовая инверсия |
left_shift(x, n), right_shift(x, n) | Побитовые сдвиги влево и вправо на n битов |
Перечисленные функции являются объектами типа ufunc и применяются к массивам поэлементно. Эти функции имеют специальные методы:
accumulate() | Аккумулирование результата. |
outer() | Внешнее "произведение". |
reduce() | Сокращение. |
reduceat() | Сокращение в заданных точках. |
Пример с функцией 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]) В таких неоднозначных случаях необходимо использовать промежуточный массив. |