Нашли ошибку?
базовыйNumPy 2.5.3

Арифметика с массивами

Сложение, умножение, деление и степень сразу для всех элементов — основа любых вычислений в NumPy.

Нужно знать:Создание массивов

Содержание статьи

Коротко

  • + - * / // % ** работают поэлементно; у двух массивов формы должны совпадать или быть совместимы по правилам транслирования.
  • Операция с числом применяется к каждому элементу: price * 1.2.
  • / всегда даёт float; // и % округляют вниз, как в Python (важно для отрицательных).
  • Результат — новый массив; изменить существующий на месте — a += b (см. операции на месте).
  • Деление на ноль не бросает исключение: для float получается inf или nan, для целых — 0, плюс RuntimeWarning.

Синтаксис

a + b, a - b, a * b, a / b      # поэлементно
a // b, a % b, a ** b
a * 2, 10 - a                   # с числом
np.add(a, b), np.multiply(a, b) # то же в виде функций (ufunc)
Оператор Функция Что делает
+, - np.add, np.subtract сложение, вычитание
*, / np.multiply, np.divide умножение, деление (результат float)
//, % np.floor_divide, np.mod целая часть вниз, остаток
** np.power степень
-a np.negative смена знака

Примеры

Данные для примеровиспользуются во всех примерах ниже
price = np.array([120.0, 80.0, 45.0])   # цена за штуку
qty = np.array([3, 10, 4])              # количество
Поэлементные операции
print(price * qty)       # стоимость каждой позиции
print(price + 5)         # с числом — к каждому элементу
qty ** 2
Вывод
[360. 800. 180.]
[125.  85.  50.]
array([  9, 100,  16])
Три вида деления
a = np.array([7, -7, 8])
print(a / 2)             # всегда float
print(a // 2)            # деление с округлением вниз, как в Python
a % 3                    # остаток того же знака, что делитель
Вывод
[ 3.5 -3.5  4. ]
[ 3 -4  4]
array([1, 2, 2])
Результат — новый массив
total = price * qty
total[0] = 0
price                    # операция создала новый массив, price не изменился
Вывод
array([120.,  80.,  45.])

Подводные камни

Деление на ноль — предупреждение, а не ошибка

Вычисление продолжается, а в результате появляются inf и nan, которые портят суммы и средние. Проверяйте делитель заранее или используйте np.divide(..., where=...) — см. where.

float делить на 0
np.array([1.0, -1.0, 0.0]) / 0
Вывод
RuntimeWarning: divide by zero encountered in divide
RuntimeWarning: invalid value encountered in divide
array([ inf, -inf,  nan])
Целые делить на 0
np.array([5, 7]) // 0    # у целых нет inf — получается 0 и предупреждение
Вывод
RuntimeWarning: divide by zero encountered in floor_divide
array([0, 0])

Целое число в отрицательной степени

Результат 2 ** -1 не целый, поэтому для целого массива NumPy отказывается его считать. Сделайте основание дробным: a.astype(float) ** -1 или 1 / a.

Отрицательная степеньошибка: ValueError
np.array([2, 4]) ** -1   # целое в отрицательной степени
Ошибка
ValueError: Integers to negative integer powers are not allowed.

Разные длины

Массивы разной длиныошибка: ValueError
price + np.array([1, 2])
Ошибка
ValueError: operands could not be broadcast together with shapes (3,) (2,)