Универсальные функции (ufuncs)
Применяйте к массивам встроенные поэлементные функции, такие как np.sqrt, np.abs, np.exp и np.log, не записывая циклы
«Универсальные функции (ufuncs)» — бесплатный урок Pandas & NumPy Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Pandas & NumPy Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Pandas & NumPy Academy содержит 4 уроков всего.
Что такое ufunc?
Универсальные функции (ufunc) одновременно выполняют математическую операцию над каждым элементом массива, используя быстрый скомпилированный код C, — гораздо быстрее цикла Python. ⚡
import numpy as np
a = np.array([1.0, 4.0, 9.0, 16.0])
print(np.sqrt(a)) # [1. 2. 3. 4.]
# Equivalent Python loop would be hundreds of times slowerМатематические ufunc: sqrt, exp, log
Все привычные математические функции являются ufunc: np.sqrt, np.exp, np.log и другие. Они применяются сразу ко всему массиву и корректно обрабатывают особые случаи.
import numpy as np
a = np.array([0.0, 1.0, 2.0, 3.0])
print(np.exp(a)) # [1. 2.718 7.389 20.086]
print(np.log(np.exp(a))) # [0. 1. 2. 3.]
print(np.log2(np.array([1, 2, 4, 8]))) # [0. 1. 2. 3.]Тригонометрические ufunc
Тригонометрические ufunc NumPy, такие как np.sin и np.cos, ожидают углы в радианах. Сначала используйте np.deg2rad для преобразования градусов.
import numpy as np
angles = np.array([0, 30, 60, 90])
rad = np.deg2rad(angles)
print(np.sin(rad).round(4)) # [0. 0.5 0.866 1. ]
print(np.cos(rad).round(4)) # [1. 0.866 0.5 0. ]np.abs, np.floor, np.ceil, np.round
Для округления используйте np.floor (вниз), np.ceil (вверх) и np.round (до ближайшего значения). Они за один шаг обрабатывают значения с плавающей точкой во всём массиве.
import numpy as np
a = np.array([-2.7, 0.4, 1.5, 3.9])
print(np.abs(a)) # [2.7 0.4 1.5 3.9]
print(np.floor(a)) # [-3. 0. 1. 3.]
print(np.ceil(a)) # [-2. 1. 2. 4.]
print(np.round(a)) # [-3. 0. 2. 4.]np.maximum и np.minimum
np.maximum(a, b) выбирает большее значение в каждой позиции из двух массивов. Это отличается от np.max, которая возвращает одно число. np.maximum(a, 0) — это ReLU!
import numpy as np
a = np.array([-3, 1, 5, -2, 4])
b = np.array([0, 0, 3, 3, 3])
print(np.maximum(a, b)) # [0 1 5 3 4]
print(np.minimum(a, b)) # [-3 0 3 -2 3]
# ReLU
print(np.maximum(a, 0)) # [0 1 5 0 4]np.clip для ограничения значений
np.clip удерживает каждый элемент внутри заданного диапазона: слишком маленькие значения увеличиваются до минимума, а слишком большие уменьшаются до максимума. Это удобно для ограничения значений.
import numpy as np
a = np.array([0.1, 0.5, -0.2, 1.3, 0.9])
clipped = np.clip(a, 0.0, 1.0)
print(clipped) # [0.1 0.5 0. 1. 0.9]ufunc для многомерных массивов
ufunc работают с массивами любой формы. Операция применяется к каждому элементу отдельно, а результат сохраняет ту же форму — изменять её не требуется.
import numpy as np
m = np.array([[1.0, 4.0], [9.0, 16.0]])
print(np.sqrt(m))
# [[1. 2.]
# [3. 4.]]Параметр out для экономии памяти
Каждая ufunc принимает аргумент out=, позволяющий записать результат в уже существующий массив. Это избавляет от создания нового массива и особенно удобно в тесных циклах, где важен расход памяти.
import numpy as np
a = np.array([1.0, 4.0, 9.0])
result = np.empty(3)
np.sqrt(a, out=result) # write directly into result
print(result) # [1. 2. 3.]np.add.reduce и .accumulate
У каждой ufunc есть метод .reduce(), который объединяет все элементы (np.add.reduce — это просто sum), а также .accumulate() для вычисления нарастающих итогов.
import numpy as np
a = np.array([1, 2, 3, 4, 5])
print(np.add.reduce(a)) # 15
print(np.add.accumulate(a)) # [ 1 3 6 10 15]
print(np.multiply.reduce(a)) # 120np.frompyfunc для пользовательских ufunc
np.frompyfunc превращает любую функцию Python в ufunc, которую можно применять к массивам. Она медленнее встроенных функций, поэтому используйте её для быстрого создания прототипов.
import numpy as np
def clamp_positive(x):
return x if x > 0 else 0.0
vfunc = np.frompyfunc(clamp_positive, 1, 1)
a = np.array([-2, 3, -1, 5])
print(vfunc(a)) # [0.0 3 0.0 5] (object dtype)Сравнение ufunc с циклами Python
Разница в скорости огромна: для миллиона элементов ufunc может работать примерно в 200 раз быстрее цикла Python. При числовых вычислениях сначала всегда выбирайте ufunc. 🚀
import numpy as np
import time
a = np.random.rand(1_000_000)
start = time.perf_counter()
np.sqrt(a)
print('ufunc:', round(time.perf_counter() - start, 4), 's')
start = time.perf_counter()
[x ** 0.5 for x in a]
print('loop:', round(time.perf_counter() - start, 4), 's')Быстрая проверка
Проверьте, насколько хорошо Вы поняли ufunc NumPy из этого урока.
Итоги урока
Отличная работа! ufunc выполняют поэлементную арифметику на быстром C-коде, включая sqrt, exp, log и тригонометрические функции, а аргумент out= экономит память. Далее: функции агрегации.
Изучай Python с ИИ-репетитором — бесплатно
Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.
- Курсы
- 30
- Уроки
- 120
Часто задаваемые вопросы
Урок «Универсальные функции (ufuncs)» бесплатный?
Да — полный текст урока «Универсальные функции (ufuncs)» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Pandas & NumPy Academy, подпишись на CoddyKit PRO. Курс Pandas & NumPy Academy содержит 4 уроков всего.
Чему я научусь в уроке «Универсальные функции (ufuncs)»?
Применяйте к массивам встроенные поэлементные функции, такие как np.sqrt, np.abs, np.exp и np.log, не записывая циклы Ты практикуешь Pandas & NumPy Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Pandas & NumPy Academy?
Предыдущий опыт не требуется. Pandas & NumPy Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Универсальные функции (ufuncs)»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Pandas & NumPy Academy?
Да. Каждый урок Pandas & NumPy Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Универсальные функции (ufuncs)
- Агрегирующие функции
- Правила broadcasting
- Булева маска и расширенная индексация