 
        
        теория 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 при плохой обусловленности СЛАУ
 
Спасибо за внимание
