В NumPy можно выполнять арифметические операции над массивами поэлементно без явных циклов Python. Это реализуется через векторизацию и broadcasting.

Примеры:

import numpy as np
 
a = np.array([1, 2, 3])
b = np.array([10, 20, 30])
 
# Поэлементное сложение
c = a + b       # array([11, 22, 33])
 
# Поэлементное вычитание
d = b - a       # array([9, 18, 27])
 
# Поэлементное умножение
e = a * b       # array([10, 40, 90])
 
# Поэлементное деление
f = b / a       # array([10., 10., 10.])
 
# Применение функций
g = np.sqrt(a)  # array([1.        , 1.41421356, 1.73205081])
h = np.exp(a)   # array([ 2.71828183,  7.3890561 , 20.08553692])

Особенности:

  • Все операции выполняются внутри NumPy на уровне C, без Python-циклов.
  • Размеры массивов должны быть совместимы по правилам broadcasting. Например:
a = np.array([1, 2, 3])        # shape (3,)
b = np.array([[10], [20]])     # shape (2,1)
 
a + b  # shape (2,3), b "растянулся" по последней оси
  • Можно комбинировать арифметику с функциями np.sum, np.mean, np.max по выбранной оси, без циклов:
matrix = np.array([[1, 2, 3],
                   [4, 5, 6]])
np.sum(matrix, axis=0)  # [5, 7, 9] — сумма по столбцам
np.mean(matrix, axis=1) # [2., 5.] — среднее по строкам

Идея: писать операции как над целыми массивами, NumPy сам решает, как эффективно пройтись по памяти.