Универсальные функции (ufunc): sin, cos, exp, log

Универсальные функции (ufunc): sin, cos, exp, log NumPy

Привет! Универсальные функции (ufunc) — это одна из ключевых фишек NumPy. Они выполняют поэлементные операции над массивами на C, что делает их невероятно быстрыми. Вместо циклов — одна строка кода.

В этой статье мы разберём:

  • Что такое ufunc
  • Тригонометрические функции: sin, cos, tan
  • Экспоненциальные функции: exp, expm1
  • Логарифмические функции: log, log10, log2
  • Дополнительные ufunc

Что нужно знать перед началом

Для этого урока тебе понадобится:

  • Установленный 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

КВИЗ

Что дальше?

Оцените статью
IMI-DS - PYTHON LERNEN
Содержание
Оглавление ×