Занятие 3
Лабораторная работа 3¶
NumPy(сокращенно от Numerical Python)— библиотека с открытым исходным кодом для языка программирования Python.
- поддержмвает многомерные массивы (включая матрицы)
- поддерживает высокоуровневые математические функции, предназначенные для работы с многомерными массивами.
NumPy обеспечивает как гибкость Python, так и скорость хорошо оптимизированного скомпилированного кода на C.
Если у вас ещё не установлен Numpy это можно сделать командой: pip install numpy
0. Массивы в Numpy¶
- Массив в NumPy это таблица элементов одного типа, пронумерованная кортежем положительных целых чисел.
- В NumPy измерения называются осями. Количество осей является рангом.
- Класс массива NumPy называется ndarray.
Обратите внимание, что массив в Numpy содержит элементы одного типа, в отличие от списка!
import numpy as np # импортируем библиотеку и заменим её ключевым словом np(для удобства)
arr1 = np.array([1, 2, 3]) # массив ранга 1
arr2 = np.array( [[1, 2, 3], [4, 2, 5]] ) # массив ранга 2(матрица с двумя строками и тремя столбцами)
1. Создание массива¶
Есть несколько способов создать массив NumPy. Рассмотрим их подробнее:
1.1 Функция array¶
Вы можете создать массив из обычного списка или кортежа, используя array().
a = np.array([[1, 2, 3], [4, 5, 6]], dtype = 'int')
print(a)
1.2. Создание массива заполнением начальными значениями¶
Допустим нам неизвестны элементы массива, но известен его размер. В NumPy существуют функции для создания массивов с начальным заполнением.
a = np.zeros(5) # создаём 1-d массив, содержащий 5 нулей
print('a:', a)
b = np.zeros((2, 3)) # создаём 2-d массив, размера 2 на 3
print('b:', b)
r = np.random.random(5) # создаём массив со случайными значениями на определённом интервале
print('r:', r)
1.3. Фунция arange¶
a = np.arange(0, 10, 2) # создаём массив от 0 до 10 с шагом 2
print(a)
1.4. reshape¶
Мы также можем менять размеры массивов. Размер массива всегда можно вычислить командой a.shape
a = np.array([[1, 2, 3, 4], [5, 2, 4, 2]])
print('a: ', a.shape)
new_a = a.reshape(4, 2)
print('new_a: ', new_a.shape)
1.5. flatten¶
Любой многомерный массив мы можем развернуть с помощью функции flatten.
a = np.array([[1, 2, 3, 4], [5, 2, 4, 2]])
new_a = a.flatten()
print(new_a)
2. Идексация массивов¶
2.1 Одномерных¶
a = np.arange(10) # создадим массив
print(a)
# как можно заменить доступ остался таким же как в списках
print('четвёртый элемент:', a[3])
print('последний элемент:', a[-1])
a[3] = 11
print('теперь четвёртый элемент:', a[3])
# мы также можем создавать срезы, как и в списках.
new_a = a[1:5]
# теперь немного магии
new_a[1] = -10
print(a)
Мы поменяли элемент среза и наш исходный массив тоже изменился!!! Почему? Это сделано специально для экономии памяти. Данные на которые ссылаются a и new_a одни и те же. Срезы – это не полноценные копии массивов, а скорее их новое представление.
2.2 Многомерных¶
x = np.array([(1, 2, 3), (4, 5, 6), (7, 8, 9)]) # создаём многомерный массив
С точки зрения математики, можно сказать, что нашим объектом является следующая матрица.
\begin{equation} \begin{bmatrix} 1 & 2 & 3\\ 4 & 5 & 6\\ 7 & 8 & 9 \end{bmatrix} \label{eq:aeqn} \end{equation}#мы также можем обращаться к элементам матрицы следующим образом
print(x[2][2])
# можем обратиться только к конкретной строке
print(x[0])
# к конкретному столбцу
print(x[:,0])
Итерирование многомерных массивов можно выполнять с помощью вложенных циклов.
for row in x:
for value in row:
print(value, end=' ')
print()
Можно использовать flat, позволяющий выводить элементы многомерного массива поэлемента.
for val in x.flat:
print(val, end=' ')
3. Операции над массивами¶
3.1 Математические операции¶
# создадим два массива
a = np.array([(1, 2, 3), (4, 5, 6), (7, 8, 9)])
b = np.array([(19, 20, 21), (22, 23, 24), (25, 26, 27)])
Мы можем складывать, умножать, делить, считать остаток и т.д поэлементно.
# сумма
print(a + b)
# разность
print(a - b)
# умножение
print(a * b)
# остаток от деления
print(b % a)
# Также, в numpy есть библиотека стандартных мат функций, которые можно применить к каждому элементу массива.
a = np.array([(1, 2, 3), (4, 5, 6), (7, 8, 9)])
np.sqrt(a)
3.2 Базовые операции с массивыми¶
a = np.array([(1, 2, 3, 4, 5, 6, 7, 8, 9)])
# сумма элементов
print(a.sum())
# произведение элементов
print(a.prod())
# макс и мин элемент
print(a.max())
print(a.min())
# среднее значение
print(a.mean())
# дисперсия
print(a.var())
P.S NumPy - мощный интсрумент, который содержит в себе много функций и методов.
Обращайтесь к туториалу: https://numpy.org/devdocs/user/quickstart.html
И не бойтесь гуглить!
Задача 1¶
Создайте две numpy матрицы, содержащие температуры в Кельвинах и Фаренгейтах на основе матрицы температур в Цельсиях.
a = np.array([(14, 23, 31, 14, 55, 36, 87, 118, 91)]) # матрица температур(в Цельсиях)
Задача 2¶
Создайте матрицу с 0 внутри и 1 на границах.
3.3 Умножения матриц¶
a = np.array([(1, 2, 3), (4, 5, 6), (7, 8, 9)])
a = np.array([(1), (4), (7)])
# можем так
print(a @ b)
# а можем так
print(a.dot(b))
A = np.array([[1.0, 2.0, 3.0],
[4.0, 5.0, 6.0]])
B = np.array([[11.0, 12.0],
[13.0, 14.0],
[15.0, 16.0]])
Задача 4¶
Мы можем расчитать норму вектора: np.linalg.norm([1.0, 2.0, 3.0]).
Найдите косинус угла между векторами:
- используя np.linalg.norm
- не используя
a = np.array([1.0, 2.0, 3.0])
b = np.array([4.0, 5.0, 6.0])
4. Линейнай алгебра в NumPy¶
4.1 Решение систем линейных уравнений¶
Библиотеку numpy удобно использовать для решения систем линейных уравнений. Если система уравнений $Ax = y$ имеет решение, и при этом только одно, то оно выражается как $x = A^{-1}y$ . Для обращения матрицы используется функция np.linalg.inv. Рассмотрим систему уравнений: $$ \left\{ \begin{array}{c} 2x + z = 1 \\ x - z = 4 \\ \end{array} \right. $$
A = np.array([[2.0, 1.0],
[1.0, -1.0]])
y = np.array([1.0, 4.0])
# решение будет
print(np.linalg.inv(A) @ y)
Задача 5¶
Решите следующую систему:
4.2 Ещё немного линейной алгебры¶
Задача 6¶
Дана матрица B.
Найдите её:
- детерминант
- ранг
- собственные значения
P.S воспользуйтесь полезным туториалом: https://www.geeksforgeeks.org/numpy-linear-algebra/?ref=lbp.
B = np.array([[11.0, 12.0],
[13.0, 14.0],
[15.0, 16.0]])
5. Математика многочленов¶
5.1 np.poly¶
# np.poly - передаём список корней, получаем коэффициенты уравнения, которое имеет данные корни:
np.poly([-1, 1, 2])
Получили уравнение:
$x^3 -2x^2 -x + 2 =0$
5.2 roots¶
# np.roots - передаём список коэффициентов уравнения, возвращаем корни.
np.roots([1, -5, 6])
Мы решили уравнение: $x^2 - 5x + 6 = 0$
Задача 7¶
Напишите функцию решающую квадратное уравнение и принимающую на вход коэффициенты этого уравнения.
6. Разные задачки¶
P.S При решении рекомендуется обращаться к руководству пользователя NumPy: https://numpy.org/doc/stable/user/index.html
Задача 9¶
Дан массив a. Поменяйте знак у элементов, кратных трём.
a = np.arange(20)
Задача 10¶
Дано 4 точки у каждой из которых есть координата x и y. Значения x и y каждой точки представлены в матрице A.
Преобразуйте их в полярные координаты.
A = np.array([[1,1],[1,0], [0,1], [0,0]]).astype(float)
Задача 11¶
Напишите функцию, которая определяет есть ли в 2D массиве нулевые столбцы.
Задача 12¶
Найдите наиболее частое значение в массиве.
Задача 13¶
Найдите наиболее частое значение в массиве.
Задача 14(2 балла)¶
Создайте класс Matrix, добавьте в него методы сложения, умножения, транспонирования, возведения в степень.
Задача 15¶
Пусть дано n, матрица A. Напишите функцию, вычисляющую ряд: $A + A^2 + ... A^n$.