Представьте прайс-лист маленькой кофейни: четыре позиции по 120, 80, 45 и 300 рублей. Вы решили сделать скидку
10 % на всё. В обычном Python цены — это список, и новую цену приходится считать для каждого элемента отдельно:
циклом или генератором списка. (Если последняя строка ячейки — просто выражение, без print, Jupyter и этот
урок показывают его значение под ячейкой.)
prices_list = [120, 80, 45, 300]
[p * 0.9 for p in prices_list][108.0, 72.0, 40.5, 270.0]
Работает, но с числами так приходится делать постоянно: каждая формула превращается в цикл. NumPy (Numerical Python) — библиотека, которая хранит числа в массивах (array) и умеет считать по всем элементам сразу. На ней построены pandas, scikit-learn, SciPy и почти весь анализ данных на Python.
Первый массив
NumPy подключают под коротким именем np — так пишут почти во всех программах и в документации:
import numpy as np
prices = np.array([120, 80, 45, 300])
pricesarray([120, 80, 45, 300])
np.array берёт список и делает из него массив. Последняя строка ячейки — просто prices, и Jupyter (как и
этот урок) показывает её значение: array([...]). По такой записи сразу видно, что перед нами массив, а не
список. print показывает тот же массив иначе:
print(prices)
print(type(prices))[120 80 45 300] <class 'numpy.ndarray'>
Элементы через пробелы, без запятых — это не ошибка, так массив выглядит при печати. Тип массива называется
ndarray (n-dimensional array, «n-мерный массив»): массивы бывают и двумерными, как таблица, — до них дойдём во
втором модуле.
Утренние температуры за неделю: 18, 21, 19, 25, 23, 17, 20 °C. Сохраните их в массив temps.
np.array(...).Заготовка упражнения обновилась с тех пор, как вы сохранили свой код.
Вернуть заготовку? Ваш код в этом упражнении будет удалён.
temps = ...Упражнение пока не решено, поэтому для ячеек ниже выполнено эталонное решение — ваш код не изменён.
temps = np.array([18, 21, 19, 25, 23, 17, 20])Действие со всем массивом сразу
Главное, ради чего нужен NumPy: арифметика с массивом применяется к каждому элементу. Цикл при этом писать не нужно — он спрятан внутри NumPy и работает на скорости языка C.
prices * 0.9array([108. , 72. , 40.5, 270. ])
Получился новый массив, а prices не изменился. Точки после чисел (108.) значат, что числа дробные: целые
цены, умноженные на 0.9, стали дробными, и NumPy не пишет ноль после точки. Лишние пробелы (108. ,) — тоже не ошибка: NumPy
выравнивает числа в столбик. Так же работают +, -, / и **
(возведение в степень):
print(prices + 50) # доставка 50 ₽ к каждой позиции
print(prices / 2) # половина цены
print(prices ** 2) # квадрат каждого числа[170 130 95 350] [ 60. 40. 22.5 150. ] [14400 6400 2025 90000]
Переведите температуры temps из градусов Цельсия в градусы Фаренгейта по формуле F = C × 9 / 5 + 32.
Результат сохраните в temps_f — это должен быть массив той же длины.
temps.Заготовка упражнения обновилась с тех пор, как вы сохранили свой код.
Вернуть заготовку? Ваш код в этом упражнении будет удалён.
temps_f = ...Упражнение пока не решено, поэтому для ячеек ниже выполнено эталонное решение — ваш код не изменён.
temps_f = temps * 9 / 5 + 32Список ведёт себя иначе
У обычного списка те же знаки означают совсем другое: * повторяет список, а + склеивает два списка.
print(prices_list * 2)
print(prices * 2)[120, 80, 45, 300, 120, 80, 45, 300] [240 160 90 600]
А умножить список на дробное число Python не может вовсе:
prices_list * 0.9TypeError: can't multiply sequence by non-int of type 'float'
Что получится, если сложить два списка: [1, 2, 3] + [10, 20, 30]?
+ у списков склеивает их в один. Поэлементное сложение, [11, 22, 33], получится у массивов — об этом следующий урок.Кофейня поднимает все цены из prices на 10 % и прибавляет к каждой 20 ₽ за стаканчик. Сохраните новые цены
в массив new_prices. Сам prices не меняйте — он ещё пригодится.
Заготовка упражнения обновилась с тех пор, как вы сохранили свой код.
Вернуть заготовку? Ваш код в этом упражнении будет удалён.
new_prices = ...Упражнение пока не решено, поэтому для ячеек ниже выполнено эталонное решение — ваш код не изменён.
new_prices = prices * 1.1 + 20Какой массив получится: np.array([10, 20]) / 4?
/ в NumPy, как и в Python, всегда даёт дробные числа. 5. — это 5.0: ноль после точки NumPy не пишет.Длительность пяти треков в секундах: 185, 240, 210, 330, 150. Создайте массив seconds с этими числами, а потом
массив minutes — те же длительности в минутах.
Заготовка упражнения обновилась с тех пор, как вы сохранили свой код.
Вернуть заготовку? Ваш код в этом упражнении будет удалён.
seconds = ...
minutes = ...Упражнение пока не решено, поэтому для ячеек ниже выполнено эталонное решение — ваш код не изменён.
seconds = np.array([185, 240, 210, 330, 150])
minutes = seconds / 60Итоги
- NumPy подключают так:
import numpy as np. np.array(список)создаёт массив. Значение ячейки выглядит какarray([...]), аprintпоказывает элементы без запятых.- Арифметика с числом (
+ - * / **) применяется к каждому элементу и даёт новый массив — без циклов. - У списков те же знаки значат другое:
*повторяет список,+склеивает.