Занятие 1
Семинар 1¶
Немного про Jupyter notebook¶
Полная документация: https://devpractice.ru/python-lesson-6-work-in-jupyter-notebook/
В Jupyter Notebook есть два режима работы: режим команд и режим редактирования
Командный режим нужен для того, чтобы взаимодействовать и управлять ячейками (добавлять, удалять, запускать, копировать, ...)
В режиме редактирования вы меняете содержимое ячейки.
Ячейки бывают двух основных типов, код и разметка
Полезные команды¶
(находясь в командном режиме)
a
- добавить пустую ячейку сверхуb
- добавить пустую ячейку снизуc
- скопировать текущую ячейкуv
- вставить скопированную ячейкуd
- удалить текущую ячейкуx
- вырезать (удалить и скопировать) текущую ячейкуm
- изменить тип выбранной ячейки на "разметка"y
- изменить тип выбранной ячейки на "код"z
- отменить последнее действие
Enter
- начать редактировать выбранную ячейку
(будучи в режим редактирования ячейки)
esc
- вернуться в командный режим
(будучи в любом режиме)
Ctrl + Enter
- запустить выбранную ячейкуShift + Enter
- запустить выбранную ячейку и выбрать следующую
2 + 2
numpy¶
- документация: http://www.numpy.org/
Библиотека numpy является удобным инструментом для работы с многомерными массивами с возможностью векторизации вычислений. Рассмотрим базовые вещи, которые можно делать с помощью нее.
import numpy as np
vec = np.array([[1, 2], [3, 4], [5, 6]])
vec
print(vec)
С чем мы работаем?
vec.dtype
type(vec)
Размер массива:
vec.shape
Число осей:
vec.ndim
У некоторых функций бывает параметр axis
, который позволяет применить эту функцию по разным осям - в данном случае, по строкам или столбцам:
np.sum(vec)
np.sum(vec, axis=0)
np.sum(vec, axis=1)
vec.sum()
Транспонируем массив:
vec.T
vec.transpose()
Обратите внимание, что переменная vec
не поменялась!
vec
Размеры массивов можно менять:
vec.reshape(2, 3)
vec.reshape(-1, 3)
vec.reshape(2, -1)
Индексирование:
vec[:, 1]
vec[2, :]
vec[1:2, 0]
vec[::2, :]
И, наконец - арифметические операции!
vec + 1
vec * 2
vec ** 2
vec + vec ** 2
vec * vec ** 2
np.sin(vec)
Матричное умножение:
vec.dot(vec ** 2)
vec.dot((vec ** 2).T)
vec @ (vec ** 2).T
vec
np.arange(3).reshape(3, 1)
vec + np.arange(3).reshape(3, 1)
Булевы массивы:
is_even = vec % 2 == 0
print(is_even)
np.sum(is_even)
Булевы массивы позволяют вытаскивать элементы с True из массива того-же размера
vec[vec % 2 == 0]
Иногда бывает полезно создавать специфичные массивы. Массив из нулей:
np.zeros((2, 3))
Массив из единиц:
np.ones((3, 2))
Единичная матрица:
np.identity(5)
Массивы можно объединять:
vec
np.hstack((vec, np.zeros(vec.shape)))
np.vstack((vec, np.zeros(vec.shape)))
Генерация случайных чисел:
np.random.rand(2, 3)
np.random.seed(2019)
np.random.rand(2, 3)
np.random.randn(3, 2)
np.random.normal(2, 1, size=3)
np.random.randint(5, 10, size=3)
Почему вообще используют numpy
?
n = 300
A = np.random.rand(n, n)
B = np.random.rand(n, n)
%%time
C = np.zeros((n, n))
for i in range(n):
for j in range(n):
for k in range(n):
C[i, j] += A[i, k] * B[k, j]
%%time
C = A @ B
Задания для самостоятельного решения¶
- Развернуть одномерный массив (сделать так, чтобы его элементы шли в обратном порядке).
- Найти максимальный нечетный элемент в массиве.
- Замените все нечетные элементы массива на ваше любимое число.
- Создайте массив первых n нечетных чисел, записанных в порядке убывания. Например, если
n=5
, то ответом будетarray([9, 7, 5, 3, 1])
. Функции, которые могут пригодиться при решении:.arange()
- Вычислите самое близкое и самое дальнее числа к данному в рассматриваемом массиве чисел. Например, если на вход поступают массив
array([0, 1, 2, 3, 4])
и число 1.33, то ответом будет(1, 4)
. Функции, которые могут пригодиться при решении:.abs()
,.argmax()
,.argmin()
- Вычисляющую первообразную заданного полинома (в качестве константы возьмите ваше любимое число). Например, если на вход поступает массив коэффициентов
array([4, 6, 0, 1])
, что соответствует полиному $4x^3 + 6x^2 + 1$, на выходе получается массив коэффициентовarray([1, 2, 0, 1, -2])
, соответствующий полиному $x^4 + 2x^3 + x - 2$. Функции, которые могут пригодиться при решении:.append()
- Пользуясь пунктом 6, посчитайте первую производную для заданного полинома в заданной точке.
# ┌(▼▼メ)┘ └(メ▼▼)┐