Занятие 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 - запустить выбранную ячейку и выбрать следующую
In [7]:
2 + 2
Out[7]:
5

numpy

Библиотека numpy является удобным инструментом для работы с многомерными массивами с возможностью векторизации вычислений. Рассмотрим базовые вещи, которые можно делать с помощью нее.

In [ ]:
import numpy as np
In [ ]:
vec = np.array([[1, 2], [3, 4], [5, 6]])
In [ ]:
vec
In [ ]:
print(vec)

С чем мы работаем?

In [ ]:
vec.dtype
In [ ]:
type(vec)

Размер массива:

In [ ]:
vec.shape

Число осей:

In [ ]:
vec.ndim

У некоторых функций бывает параметр axis, который позволяет применить эту функцию по разным осям - в данном случае, по строкам или столбцам:

In [ ]:
np.sum(vec)
In [ ]:
np.sum(vec, axis=0)
In [ ]:
np.sum(vec, axis=1)
In [ ]:
vec.sum()

Транспонируем массив:

In [ ]:
vec.T
In [ ]:
vec.transpose()

Обратите внимание, что переменная vec не поменялась!

In [ ]:
vec

Размеры массивов можно менять:

In [ ]:
vec.reshape(2, 3)
In [ ]:
vec.reshape(-1, 3)
In [ ]:
vec.reshape(2, -1)

Индексирование:

In [ ]:
vec[:, 1]
In [ ]:
vec[2, :]
In [ ]:
vec[1:2, 0]
In [ ]:
vec[::2, :]

И, наконец - арифметические операции!

In [ ]:
vec + 1
In [ ]:
vec * 2
In [ ]:
vec ** 2
In [ ]:
vec + vec ** 2
In [ ]:
vec * vec ** 2
In [ ]:
np.sin(vec)

Матричное умножение:

In [ ]:
vec.dot(vec ** 2)
In [ ]:
vec.dot((vec ** 2).T)
In [ ]:
vec @ (vec ** 2).T
In [ ]:
vec
In [ ]:
np.arange(3).reshape(3, 1)
In [ ]:
vec + np.arange(3).reshape(3, 1)

Булевы массивы:

In [ ]:
is_even = vec % 2 == 0
print(is_even)
In [ ]:
np.sum(is_even)

Булевы массивы позволяют вытаскивать элементы с True из массива того-же размера

In [ ]:
vec[vec % 2 == 0]

Иногда бывает полезно создавать специфичные массивы. Массив из нулей:

In [ ]:
np.zeros((2, 3))

Массив из единиц:

In [ ]:
np.ones((3, 2))

Единичная матрица:

In [ ]:
np.identity(5)

Массивы можно объединять:

In [ ]:
vec
In [ ]:
np.hstack((vec, np.zeros(vec.shape)))
In [ ]:
np.vstack((vec, np.zeros(vec.shape)))

Генерация случайных чисел:

In [ ]:
np.random.rand(2, 3)
In [ ]:
np.random.seed(2019)
np.random.rand(2, 3)
In [ ]:
np.random.randn(3, 2)
In [ ]:
np.random.normal(2, 1, size=3)
In [ ]:
np.random.randint(5, 10, size=3)

Почему вообще используют numpy?

In [ ]:
n = 300
A = np.random.rand(n, n)
B = np.random.rand(n, n)
In [ ]:
%%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]
In [ ]:
%%time
C = A @ B

Задания для самостоятельного решения

  1. Развернуть одномерный массив (сделать так, чтобы его элементы шли в обратном порядке).
  2. Найти максимальный нечетный элемент в массиве.
  3. Замените все нечетные элементы массива на ваше любимое число.
  4. Создайте массив первых n нечетных чисел, записанных в порядке убывания. Например, если n=5, то ответом будет array([9, 7, 5, 3, 1]). Функции, которые могут пригодиться при решении: .arange()
  5. Вычислите самое близкое и самое дальнее числа к данному в рассматриваемом массиве чисел. Например, если на вход поступают массив array([0, 1, 2, 3, 4]) и число 1.33, то ответом будет (1, 4). Функции, которые могут пригодиться при решении: .abs(), .argmax(), .argmin()
  6. Вычисляющую первообразную заданного полинома (в качестве константы возьмите ваше любимое число). Например, если на вход поступает массив коэффициентов array([4, 6, 0, 1]), что соответствует полиному $4x^3 + 6x^2 + 1$, на выходе получается массив коэффициентов array([1, 2, 0, 1, -2]), соответствующий полиному $x^4 + 2x^3 + x - 2$. Функции, которые могут пригодиться при решении: .append()
  7. Пользуясь пунктом 6, посчитайте первую производную для заданного полинома в заданной точке.
In [ ]:
# ┌(▼▼メ)┘ └(メ▼▼)┐