Универсальные функции: быстрые поэлементные функции от массивов

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

Многие универсальные функции — это простые поэлементные преобразования, такие как sqrt и exp:

In [74]: arr = np.arange(10)

In [75]: arr
Out[75]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

In [76]: np.sqrt(arr)
Out[76]: 
array([0.        , 1.        , 1.41421356, 1.73205081, 2.        ,
       2.23606798, 2.44948974, 2.64575131, 2.82842712, 3.        ])

In [77]: np.exp(arr)
Out[77]: 
array([1.00000000e+00, 2.71828183e+00, 7.38905610e+00, 2.00855369e+01,
       5.45981500e+01, 1.48413159e+02, 4.03428793e+02, 1.09663316e+03,
       2.98095799e+03, 8.10308393e+03])

Они являются унарными универсальными функциями. Такие функции как add или maximum принимают два массива (таким образом, они бинарные) и возвращают один массив:

In [78]: x = np.random.randn(8)

In [79]: y = np.random.randn(8)

In [80]: x
Out[80]: 
array([-0.6170843 ,  0.60137616, -1.07327493,  0.84037086, -0.34779787,
       -1.44563308, -0.08710135,  0.99717   ])

In [81]: y
Out[81]: 
array([ 0.37385011, -2.77545805, -0.25609749,  1.40563358,  0.32337793,
        0.85690424,  0.26611575,  0.18535124])

In [82]: np.maximum(x, y)
Out[82]: 
array([ 0.37385011,  0.60137616, -0.25609749,  1.40563358,  0.32337793,
        0.85690424,  0.26611575,  0.99717   ])

Функция np.maximum вычисляет максимумы элементов массивов x и y.

Универсальная функция может возвращать несколько массивов (хотя и не часто). Например, функция np.modf (векторизованная версия встроенной функции divmod) возвращает целую и дробную части массива чисел с плавающей запятой:

In [83]: arr = np.random.randn(7) * 5

In [84]: arr
Out[84]: 
array([ 8.93980752, -4.39765192, -1.63135584, -4.02920646,  6.02708204,
        0.43352538,  1.00886326])

In [85]: frac_part, int_part = np.modf(arr) 

In [86]: frac_part
Out[86]: 
array([ 0.93980752, -0.39765192, -0.63135584, -0.02920646,  0.02708204,
        0.43352538,  0.00886326])

In [87]: int_part
Out[87]: array([ 8., -4., -1., -4.,  6.,  0.,  1.])

Универсальные функции принимают опциональный аргумент out, который позволяет выполнять операции прямо в заданном массиве.

In [88]: arr
Out[88]: 
array([ 8.93980752, -4.39765192, -1.63135584, -4.02920646,  6.02708204,
        0.43352538,  1.00886326])

In [89]: np.sqrt(arr)
<ipython-input-68-b58949107b3d>:1: RuntimeПредупреждение: invalid value encountered in sqrt
  np.sqrt(arr)
Out[89]: 
array([2.98995109,        nan,        nan,        nan, 2.45501162,
       0.65842645, 1.00442185])

In [90]: np.sqrt(arr, arr)
<ipython-input-69-164954cb2c14>:1: RuntimeПредупреждение: invalid value encountered in sqrt
  np.sqrt(arr, arr)
Out[90]: 
array([2.98995109,        nan,        nan,        nan, 2.45501162,
       0.65842645, 1.00442185])

In [91]: arr
Out[91]: 
array([2.98995109,        nan,        nan,        nan, 2.45501162,
       0.65842645, 1.00442185])

В таблицах numpy:ufuncs:tbl:1 и numpy:ufuncs:tbl:2 представлены доступные универсальные функции.

Таблица 2. Унарные универсальные функции

Функция Описание
abs, fabs Вычисляет абсолютные значения каждого элементов массива
sqrt Вычисляет квадратный корень из каждого элемента массива (эквивалентно arr ** 0.5)
square Вычисляет квадрат каждого элемента массива (эквивалентно arr ** 2)
exp Вычисляет экспоненту (\( e^x \)) от каждого элемента массива
log, log10, log2, log1p Вычисляет натуральный, десятичный логарифмы, логарифм по основанию \( 2 \) и \( \log(1 + x) \), соответственно
sign Вычисляет знак каждого элемента: \( 1 \) (положительный элемент), \( 0 \) (ноль), \( -1 \) (отрицательный элемент)
ceil Вычисляет наименьшее целое число большее либо равное каждого элемента массива
floor Вычисляет наибольшее целое число меньшее либо равное каждого элемента массива
rint Округляет элементы к ближайшим целым сохраняя dtype
modf Возвращает дробные и целые части каждого элемента массива
isnan Возвращает булев массив, указывающий является каждый элемент входного массива NaN (Not A Number)
isfinite, isinf Возвращает булев массив, указывающий является каждый элемент конечным (не inf и не NaN) или бесконечным, соотвественно
cos, cosh, sin, sinh, tan, tanh Обычные и тригонометрические функции
arccos, arccosh, arcsin, arcsinh, arctan, arctanh Обратные тригонометрические функции
logical_not Вычисляет истиное значение not x для каждого элемента (эквивалентно  arr)

Таблица 3. Бинарные универсальные функции

Функция Описание
add Складывает соответствующие элементы массивов
subtract Вычитает соответствующие элементы второго массива из элементов первого
multiply Перемножает элементы массивов
divide, floor_devide Деление или деление с отбрасыванием остатка
power Возведение элементов первого массива в степени указанные во втором массиве
maximum, fmax Поэлементный максимум, fmax игнорирует NaN
minimum, fmin Поэлементный минимум, fmin игнорирует NaN
mod Поэлементный модуль (остаток от деления)
copysign Копирует знаки элементов второго массива в элементы первого массива
greater, greater_equal, less, less_equal, equal, not_equal Поэлементное сравнение (эквивалентны операторам >, >=, <, <= `==`, !=)
logical_and, logical_or, logical_xor Вычисляет поэлементное значение истинности логической операций (эквивалентны операторам &, ` | `, ^)