Pandas & NumPy Academy · Урок

Универсальные функции (ufuncs)

Применяйте к массивам встроенные поэлементные функции, такие как np.sqrt, np.abs, np.exp и np.log, не записывая циклы

Урок 1 из 413 шагов

«Универсальные функции (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))  # 120

np.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 — локальная установка не требуется.

Все уроки этого курса

  1. Универсальные функции (ufuncs)
  2. Агрегирующие функции
  3. Правила broadcasting
  4. Булева маска и расширенная индексация
← Назад к Pandas & NumPy Academy