Нашли ошибку?
Скачать чистый
урок 3 из 5≈ 15 минупражнения: 0 из 4

Массив с массивом

Арифметика между двумя массивами — поэлементно, пара за парой; целочисленное деление и остаток; что будет, если длины разные.

Python запустится при первом выполнении

В прошлом уроке массив встречался с числом. Но чаще данные приходят парами: цены и количества, план и факт, утро и вечер. Два массива одной длины NumPy складывает, вычитает, умножает и делит поэлементно: первый элемент с первым, второй со вторым и так далее.

[ ]Цены × количества
import numpy as np

prices = np.array([120, 80, 45, 300])
qty = np.array([3, 5, 10, 1])
prices * qty
Выводсохранённый · нажмите «Выполнить», чтобы получить свой
array([360, 400, 450, 300])

Получилась стоимость каждой позиции: 120 × 3, 80 × 5, 45 × 10 и 300 × 1. Никакого цикла по индексам — NumPy сам ставит элементы в пары по порядку. Поэтому порядок важен: в qty на первом месте должно стоять количество именно первого товара.

Так же работают вычитание и деление:

[ ]План и факт
plan = np.array([50, 40, 60])
fact = np.array([46, 44, 60])
print(fact - plan)   # на сколько отличается от плана
print(fact / plan)   # какая доля плана выполнена
Выводсохранённый · нажмите «Выполнить», чтобы получить свой
[-4  4  0]
[0.92 1.1  1.  ]
[ ]Упражнение 1Продажи за день решено

В массивах morning и evening — число чашек кофе, проданных утром и вечером в каждый день недели. Сохраните в total продажи за каждый день целиком.

morning = np.array([34, 41, 38, 45, 52, 60, 58])
evening = np.array([21, 25, 19, 30, 44, 51, 40])
total = ...

Целочисленное деление и остаток

Обычное деление / всегда даёт дробное число. Иногда нужно другое: сколько целых раз одно число помещается в другом — это //, и что осталось — это % (остаток от деления). Например, минуты в часы и минуты:

[ ]Минуты → часы и минуты
minutes = np.array([75, 130, 45, 200])
print(minutes // 60)   # целые часы
print(minutes % 60)    # оставшиеся минуты
Выводсохранённый · нажмите «Выполнить», чтобы получить свой
[1 2 0 3]
[15 10 45 20]

75 минут — это 1 час (75 // 60) и 15 минут (75 % 60). И //, и % работают поэлементно — с числом и с другим массивом.

[ ]Упражнение 2Секунды на часах решено

Длительность звонков в секундах лежит в массиве calls. Сохраните в mins целые минуты каждого звонка, а в secs — оставшиеся секунды: например, 130 секунд — это 2 минуты и 10 секунд.

calls = np.array([130, 59, 360, 245, 61])
mins = ...
secs = ...

Вопрос

Что получится: np.array([1, 2, 3]) * np.array([2, 2, 2])?

Когда длины разные

Пары можно составить, только если у массивов одинаковая длина. Проверить длину помогает встроенная функция len — она работает и с массивами:

[ ]Длина массива
print(len(prices), len(qty))
print(len(np.array([1, 2, 3])))
Выводсохранённый · нажмите «Выполнить», чтобы получить свой
4 4
3

Если длины не совпадают, NumPy не станет угадывать, кого с кем сложить, и сообщит об ошибке:

[ ]Массивы разной длиныошибка: ValueError
np.array([1, 2, 3]) + np.array([10, 20])
Ошибкасохранённый · нажмите «Выполнить», чтобы получить свой
ValueError: operands could not be broadcast together with shapes (3,) (2,) 
[ ]Упражнение 3Средний чек решено

В revenue — выручка кофейни за пять дней, в checks — сколько в эти дни было покупок. Посчитайте средний чек каждого дня — выручку, делённую на число покупок, — и сохраните в avg_check.

revenue = np.array([18400, 21150, 16800, 25300, 30600])
checks = np.array([92, 105, 80, 110, 136])
avg_check = ...

[ ]Упражнение 4Выполнение плана решено

Менеджеры по пяти городам получили план продаж goal и выполнили done. Посчитайте процент выполнения плана по каждому городу — done от goal, умноженное на 100, — и сохраните в percent.

goal = np.array([500, 320, 280, 150, 200])
done = np.array([540, 288, 280, 90, 230])
percent = ...

Итоги

  • Два массива одной длины складываются, вычитаются, умножаются и делятся поэлементно — пара за парой.
  • // — целочисленное деление, % — остаток; оба работают поэлементно.
  • len(массив) — число элементов.
  • Разная длина — ошибка ValueError про broadcast.

Подробнее в справочнике

Нашли ошибку?