Привет! Универсальные функции (ufunc) — это одна из ключевых фишек NumPy. Они выполняют поэлементные операции над массивами на C, что делает их невероятно быстрыми. Вместо циклов — одна строка кода.
В этой статье мы разберём:
- Что такое ufunc
- Тригонометрические функции: sin, cos, tan
- Экспоненциальные функции: exp, expm1
- Логарифмические функции: log, log10, log2
- Дополнительные ufunc
- Что нужно знать перед началом
- Основная часть
- Что такое ufunc
- Основные тригонометрические функции
- Обратные тригонометрические функции
- Экспоненциальные функции
- Логарифмические функции
- Степенные и корневые функции
- Гиперболические функции
- Дополнительные ufunc
- Полный пример
- Задачи для закрепления
- Нюансы и подводные камни
- Логарифм от нуля или отрицательного числа
- Тригонометрические функции в радианах
- Числа с плавающей точкой
- Частые ошибки и как их избежать
- Ошибка 1: Использование градусов вместо радиан
- Ошибка 2: Логарифм отрицательных чисел
- Ошибка 3: Путаница между log и log10
- Шпаргалка
- Заключение
- КВИЗ
- Что дальше?
Что нужно знать перед началом
Для этого урока тебе понадобится:
- Установленный NumPy
- Базовое понимание массивов
Совет: Ufunc применяются к каждому элементу массива независимо, что делает код чистым и быстрым.
Основная часть
Что такое ufunc
Ufunc (universal function) — это функция, которая работает с массивами поэлементно.
import numpy as np
arr = np.array([0, np.pi/2, np.pi])
# Тригонометрические функции — примеры ufunc
print(np.sin(arr)) # [0.0000000e+00 1.0000000e+00 1.2246468e-16]
print(np.cos(arr)) # [ 1.000000e+00 6.123234e-17 -1.000000e+00]
print(np.tan(arr)) # [ 0.00000000e+00 1.63312394e+16 -1.22464680e-16]Совет: Ufunc работают на C, поэтому они значительно быстрее циклов Python.
Основные тригонометрические функции
import numpy as np
# Создаём массив углов
angles = np.array([0, 30, 45, 60, 90]) * np.pi / 180
print("Углы в радианах:", angles)
# Синус
print("sin:", np.sin(angles))
# [0. 0.5 0.70710678 0.8660254 1. ]
# Косинус
print("cos:", np.cos(angles))
# [1. 0.8660254 0.70710678 0.5 0. ]
# Тангенс
print("tan:", np.tan(angles))
# [0. 0.57735027 1. 1.73205081 1.63312394e+16]Совет: Тригонометрические функции работают в радианах. Используй
np.deg2rad()для преобразования.
Обратные тригонометрические функции
values = np.array([0, 0.5, 0.707, 0.866, 1])
print("arcsin:", np.arcsin(values))
print("arccos:", np.arccos(values))
print("arctan:", np.arctan(values))Экспоненциальные функции
arr = np.array([0, 1, 2, 3, 4])
# exp — экспонента (e^x)
print("exp:", np.exp(arr))
# [ 1. 2.71828183 7.3890561 20.08553692 54.59815003]
# expm1 — e^x - 1 (более точна для малых x)
print("expm1:", np.expm1(arr))
# [ 0. 1.71828183 6.3890561 19.08553692 53.59815003]Совет:
expm1даёт более точные результаты для малых значений x, так как избегает потери точности.
Логарифмические функции
arr = np.array([1, 10, 100, 1000])
# Натуральный логарифм (основание e)
print("ln (log):", np.log(arr))
# [0. 2.30258509 4.60517019 6.90775528]
# Десятичный логарифм (основание 10)
print("log10:", np.log10(arr))
# [0. 1. 2. 3.]
# Двоичный логарифм (основание 2)
print("log2:", np.log2(arr))
# [0. 3.32192809 6.64385619 9.96578428]Совет:
log— натуральный логарифм (основание e). Для других оснований используйlog10иlog2.
Степенные и корневые функции
arr = np.array([1, 4, 9, 16])
# Квадратный корень
print("sqrt:", np.sqrt(arr))
# [1. 2. 3. 4.]
# Возведение в степень
print("power (2^arr):", np.power(2, arr))
# [2 16 512 65536]
# cube root (кубический корень)
print("cbrt:", np.cbrt(arr))
# [1. 1.58740105 2.08008382 2.5198421 ]Совет:
np.power()возводит первый аргумент в степень второго.
Гиперболические функции
arr = np.array([0, 1, 2])
print("sinh:", np.sinh(arr))
print("cosh:", np.cosh(arr))
print("tanh:", np.tanh(arr))Совет: Гиперболические функции часто используются в машинном обучении (функции активации).
Дополнительные ufunc
# Абсолютное значение
arr = np.array([-5, -3, 0, 3, 5])
print("abs:", np.abs(arr)) # [5 3 0 3 5]
# Знак числа
print("sign:", np.sign(arr)) # [-1 -1 0 1 1]
# Округление
arr_float = np.array([1.2, 2.7, 3.5])
print("floor:", np.floor(arr_float)) # [1. 2. 3.]
print("ceil:", np.ceil(arr_float)) # [2. 3. 4.]
print("round:", np.round(arr_float)) # [1. 3. 4.]
# Минимум и максимум между массивами
a = np.array([1, 5, 3])
b = np.array([4, 2, 6])
print("maximum:", np.maximum(a, b)) # [4 5 6]
print("minimum:", np.minimum(a, b)) # [1 2 3]Совет:
np.maximum()иnp.minimum()полезны для сравнения двух массивов поэлементно.
Полный пример
import numpy as np
# Создаём массив
x = np.linspace(-2, 2, 9)
print("x:", x)
# [-2. -1.5 -1. -0.5 0. 0.5 1. 1.5 2. ]
# Тригонометрические
print("\nТригонометрические:")
print("sin(x):", np.sin(x))
print("cos(x):", np.cos(x))
# Экспоненциальные
print("\nЭкспоненциальные:")
print("exp(x):", np.exp(x))
print("expm1(x):", np.expm1(x))
# Логарифмические (только для положительных)
x_pos = np.array([0.1, 1, 10, 100])
print("\nЛогарифмические:")
print("log(x):", np.log(x_pos))
print("log10(x):", np.log10(x_pos))
print("log2(x):", np.log2(x_pos))
# Степенные
print("\nСтепенные:")
print("sqrt(x):", np.sqrt(np.abs(x)))
print("power(x, 2):", np.power(x, 2))
# Дополнительные
print("\nДополнительные:")
print("abs(x):", np.abs(x))
print("sign(x):", np.sign(x))
print("round(x):", np.round(x))Задачи для закрепления
Задача 1. Вычисли синус массива углов от 0 до 90 градусов.
Задача 2. Вычисли экспоненту массива [0, 1, 2, 3, 4, 5].
Задача 3. Вычисли натуральный логарифм чисел [1, 10, 100, 1000].
Задача 4. Найди квадратный корень чисел [0, 1, 4, 9, 16, 25].
Задача 5. Вычисли абсолютное значение массива [-5, -3, 0, 3, 5].
Ответы:
Задача 1.
import numpy as np
angles = np.array([0, 30, 45, 60, 90]) * np.pi / 180
print(np.sin(angles))Задача 2.
arr = np.array([0, 1, 2, 3, 4, 5])
print(np.exp(arr))Задача 3.
arr = np.array([1, 10, 100, 1000])
print(np.log(arr))Задача 4.
arr = np.array([0, 1, 4, 9, 16, 25])
print(np.sqrt(arr))Задача 5.
arr = np.array([-5, -3, 0, 3, 5])
print(np.abs(arr))Нюансы и подводные камни
Логарифм от нуля или отрицательного числа
np.log(0) даёт -inf, а np.log(-1) даёт nan. Будь осторожен.
Тригонометрические функции в радианах
Все тригонометрические функции работают в радианах. Используй np.deg2rad() для преобразования.
Числа с плавающей точкой
np.tan(π/2) даёт очень большое число, но не inf, так как π/2 — это приближённое значение.
Частые ошибки и как их избежать
Ошибка 1: Использование градусов вместо радиан
Используй np.deg2rad() или radians = degrees * np.pi / 180.
Ошибка 2: Логарифм отрицательных чисел
Проверяй, что массив содержит только положительные числа.
Ошибка 3: Путаница между log и log10
np.log — натуральный, np.log10 — десятичный.
Шпаргалка
| Функция | Описание |
|---|---|
np.sin() | Синус |
np.cos() | Косинус |
np.tan() | Тангенс |
np.exp() | Экспонента (e^x) |
np.expm1() | e^x — 1 |
np.log() | Натуральный логарифм |
np.log10() | Десятичный логарифм |
np.log2() | Двоичный логарифм |
np.sqrt() | Квадратный корень |
np.power() | Возведение в степень |
np.abs() | Абсолютное значение |
np.sign() | Знак числа |
np.floor() | Округление вниз |
np.ceil() | Округление вверх |
np.round() | Обычное округление |
Заключение
Сегодня мы:
- Узнали, что такое ufunc
- Изучили тригонометрические функции
- Разобрали exp и log
- Познакомились с дополнительными ufunc





