теория 1к 2с / Матричные операции и СЛАУ - практика
.pdfОсновы работы с матрицами в Python и NumPy
Подготовка
Все дальнейшие примеры кода подразумевают, что модуль NumPy импортирован следующим образом:
1 import numpy as np
Создание матриц
|
Исходный код |
|
|
Результат |
|
|
|
|
|
|
|
1 |
# Вектор строка |
|
a = |
|
|
2 |
a = np.array([1, 2, 3]) |
|
[1 |
2 3] |
|
3 |
print("a =\n", a) |
|
b = |
|
|
4 |
|
|
[[1] |
|
|
5 |
# Вектор столбец |
|
[2] |
|
|
6 |
b = np.array([[1, 2, 3]]).T |
|
[3]] |
|
|
7 |
print("b =\n", b) |
|
c = |
|
|
8 |
|
|
[[1 2 3] |
|
|
9 |
# Матрица |
|
[4 |
5 6]] |
|
10 |
c = np.array([ |
|
|
|
|
|
|
|
|
||
11 |
[1, 2, 3], |
|
|
|
|
|
|
|
|
||
12 |
[4, 5, 6] |
|
|
|
|
13])
14print("c =\n", c)
Обратите внимание на двойные скобки при создании вектора-столбца
Создание матриц
|
|
Исходный код |
|
|
|
Результат |
||||
|
|
|
|
|
|
|
|
|
||
|
1 |
a = np.linspace(0, 1, 5) |
|
|
|
a = |
|
|
|
|
|
2 |
print("a =\n", a) |
|
|
|
[0. |
0.25 |
0.5 |
0.75 1. ] |
|
|
3 |
|
|
|
|
b = |
|
|
|
|
|
4 |
b = np.arange(0, 1, 0.25) |
|
|
|
[0. |
0.25 |
0.5 |
0.75] |
|
|
5 |
print("b =\n", b) |
|
|
|
c = |
|
|
|
|
|
6 |
|
|
|
|
[[0. 0. 0.] |
|
|
|
|
|
7 |
c = np.zeros((2, 3)) |
|
|
|
[0. 0. 0.]] |
|
|
|
|
|
8 |
print("c =\n", c) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Множество других функций для создания матриц можно найти в документации по NumPy
Преобразование матриц
|
|
Исходный код |
|
|
|
Результат |
|||||
|
|
|
|
|
|
|
|
|
|
||
|
1 |
# Создание исходной матрицы |
|
|
|
a = |
|
|
|
|
|
|
2 |
a = np.array([[0, 1, 2, 3], |
|
|
|
[[ 0 |
1 |
2 |
3] |
|
|
|
3 |
[4, 5, 6, 7], |
|
|
|
[ 4 |
5 |
6 |
7] |
|
|
|
4 |
[8, 9, 10, 11] |
|
|
|
[ 8 |
9 10 11]] |
|
|
||
|
5 |
]) |
|
|
|
b = |
|
|
|
|
|
|
6 |
print("a =\n", a) |
|
|
|
[[ 0 |
1] |
|
|
|
|
|
7 |
|
|
|
|
[ 2 |
3] |
|
|
|
|
|
8 |
# Изменение размера матрицы |
|
|
|
[ 4 |
5] |
|
|
|
|
|
9 |
b = np.reshape(a, (6, 2)) |
|
|
|
[ 6 |
7] |
|
|
|
|
|
10 |
print("b =\n", b) |
|
|
|
[ 8 |
9] |
|
|
|
|
|
11 |
|
|
|
|
[10 11]] |
|
|
|
|
|
|
12 |
# Транспонирование |
|
|
|
с = |
|
|
|
|
|
|
13 |
с = b.T |
|
|
|
[[ 0 |
2 |
4 |
6 |
8 10] |
|
|
14 |
print("с =\n", с) |
|
|
|
[ 1 |
3 |
5 |
7 |
9 11]] |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Новый размер матрицы должен сохранять общее количество элементов
Операции с матрицами
|
|
Исходный код |
|
|
|
|
|
Результат |
|||
|
|
|
|
|
|
|
|
|
|||
|
1 |
a = np.array([[1, 2, 3], |
|
|
|
c0 |
= |
|
|
|
|
|
2 |
|
[4, 5, 6]]) |
|
|
|
[[ 2 |
4 |
6] |
|
|
|
3 |
b = np.array([1, 2, 4]) |
|
|
|
[ |
8 |
10 12]] |
|
||
|
4 |
|
|
|
|
|
c1 |
= |
|
|
|
|
5 |
c0 |
= a + a |
|
|
|
[[ 2 |
4 |
7] |
|
|
|
6 |
print("c0 =\n", c0) |
|
|
|
[ |
5 |
7 10]] |
|
||
|
7 |
c1 |
= a + b |
|
|
|
c2 |
= |
|
|
|
|
8 |
print("c1 =\n", c1) |
|
|
|
[[ 1 |
4 |
12] |
|
||
|
9 |
c2 |
= a * b |
|
|
|
[ |
4 |
10 24]] |
|
|
|
10 |
print("c2 =\n", c2) |
|
|
|
c3 |
= |
|
|
|
|
|
11 |
|
|
|
|
|
[17 38] |
|
|
||
|
12 |
c3 |
= np.dot(a, b) |
|
|
|
c4 |
= |
|
|
|
|
13 |
print("c3 =\n", c3) |
|
|
|
[17 38] |
|
|
|||
|
14 |
c4 |
= a @ b |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
15 |
print("c4 =\n", c4) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Все простые математические операции выполняются поэлементно
Линейная алгебра
|
Исходный код |
|
Результат |
|
|
|
|
|
|
1 |
a = np.array([[-4, -3, -2], |
|
norm = 7.745966692414834 |
|
2 |
[-1, 0, -1], |
|
det = -12.0 |
|
3 |
[2, 3, 4]]) |
|
trace = 0 |
|
4 |
# Норма матрицы |
|
a = |
|
5 |
norm = np.linalg.norm(a) |
|
[[-4 -3 -2] |
|
6 |
print("norm =", norm) |
|
[-1 0 -1] |
|
7 |
# Определитель матрицы |
|
[ 2 3 4]] |
|
8 |
det = np.linalg.det(a) |
|
|
|
|
|
|
||
9 |
print("det =", det) |
|
|
|
|
|
|
||
10 |
# След матрицы |
|
|
|
11 |
trace = np.trace(a) |
|
|
|
12print("trace =", trace)
13# Обратная матрица
14inv = np.linalg.inv(a)
15print("a =\n", a)
Множество других функций линейной алгебры можно найти в документации по NumPy
Решение СЛАУ
Рассмотрим следующую систему
Решение СЛАУ
|
|
Исходный код |
|
|
Результат |
|||
|
|
|
|
|
|
|
||
|
1 |
a = np.array([[1, 2], |
|
|
|
s1 = [-1. |
1.] |
|
|
2 |
[3, 5]]) |
|
|
|
s2 = [-1. |
1.] |
|
|
3 |
b = np.array([1, 2]) |
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
4 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
5 |
# Точное решение СЛАУ |
|
|
|
|
|
|
|
6 |
s1 = np.linalg.solve(a, b) |
|
|
|
|
|
|
|
7 |
print("s1 =", s1) |
|
|
|
|
|
|
|
8 |
# Решения СЛАУ методом |
|
|
|
|
|
|
|
9 |
# наименьших квадратов |
|
|
|
|
|
|
|
10 |
s2 = np.linalg.lstsq(a, b)[0] |
|
|
|
|
|
|
|
11 |
print("s2 =", s2) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Используйте функцию lstsq при плохой обусловленности СЛАУ
Спасибо за внимание