Коротко
+ - * / // % **работают поэлементно; у двух массивов формы должны совпадать или быть совместимы по правилам транслирования.- Операция с числом применяется к каждому элементу:
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.
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])
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.
np.array([2, 4]) ** -1 # целое в отрицательной степениОшибка
ValueError: Integers to negative integer powers are not allowed.
Разные длины
price + np.array([1, 2])Ошибка
ValueError: operands could not be broadcast together with shapes (3,) (2,)