Универсальные функции (или 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 | Вычисляет поэлементное значение истинности логической операций (эквивалентны операторам & , ` | `, ^ ) |