Линейная алгебра на Python. [Урок 1]. Создание Матрицы. Общие понятия
![]()
Эта статья открывает список уроков на тему “Линейная алгебра с примерами на Python“ . Мы постараемся рассказать о базовых понятиях линейной алгебры, которые могут быть полезны тем, кто занимается машинным обучением и анализом данных, и будем сопровождать все это примерами на языке Python .
- Матрицы
- Виды матриц и способы их создания в Python
- Вектор
- Вектор-строка
- Вектор-столбец
Матрицы
Матрицей в математике называют объект, записываемый в виде прямоугольной таблицы, элементами которой являются числа (могут быть как действительные, так и комплексные). Пример матрицы приведен ниже.
В общем виде матрица записывается так:
Представленная выше матрица состоит из i-строк и j-столбцов. Каждый ее элемент имеет соответствующее позиционное обозначение, определяемое номером строки и столбца на пересечении которых он расположен: \(a_\)- находится на i-ой строке и j-м столбце.
Важным элементом матрицы является главная диагональ , ее составляют элементы, у которых совпадают номера строк и столбцов.
Виды матриц и способы их создания в Python
Матрица в Python – это двумерный массив, поэтому задание матриц того или иного вида предполагает создание соответствующего массива. Для работы с массивами в Python используется тип данных список (англ. list ). Но с точки зрения представления матриц и проведения вычислений с ними списки – не очень удобный инструмент, для этих целей хорошо подходит библиотека Numpy , ее мы и будем использовать в дальнейшей работе.
Напомним, для того, чтобы использовать библиотеку Numpy ее нужно предварительно установить, после этого можно импортировать в свой проект. По установке Numpy можно подробно прочитать в разделе “Установка библиотеки Numpy” из введения. Для того чтобы импортировать данный модуль, добавьте в самое начало программы следующую строку
import numpy as np
Если после импорта не было сообщений об ошибке, то значит все прошло удачно и можно начинать работу. Numpy содержит большое количество функций для работы с матрицами, которые мы будем активно использовать. Обязательно убедитесь в том, что библиотека установлена и импортируется в проект без ошибок.
Рассмотрим, различные варианты матриц и способы их задания в Python .
Вектор
Вектором называется матрица, у которой есть только один столбец или одна строка. Более подробно свойства векторов, их геометрическая интерпретация и операции над ними будут рассмотрены в “ Главе 2 Векторная алгебра” .
Вектор-строка
Вектор-строка имеет следующую математическую запись.
Такой вектор в Python можно задать следующим образом.
>>> v_hor_np = np.array([1, 2]) >>> print(v_hor_np ) [1 2]
Если необходимо создать нулевой или единичный вектор , то есть вектор, у которого все элементы нули либо единицы, то можно использовать специальные функции из библиотеки Numpy .
Создадим нулевую вектор-строку размера 5 .
>>> v_hor_zeros_v1 = np.zeros((5,)) >>> print(v_hor_zeros_v1 ) [0. 0. 0. 0. 0.]
В случае, если требуется построить вектор-строку так, чтобы она сама являлась элементом какого-то массива, это нужно для возможности транспонирования матрицы (см. раздел “ 1.3 Транспонирование матрицы” ), то данную задачу можно решить так.
>>> v_hor_zeros_v2 = np.zeros((1, 5)) >>> print(v_hor_zeros_v2 ) [[0. 0. 0. 0. 0.]]
Построим единичную вектор-строку в обоих из представленных для нулевого вектора-строки форм.
>>> v_hor_one_v1 = np.ones((5,)) >>> print(v_hor_one_v1) [1. 1. 1. 1. 1.]
>>> v_hor_one_v2 = np.ones((1, 5)) >>> print(v_hor_one_v2) [[1. 1. 1. 1. 1.]]
Вектор-столбец
Вектор-столбец имеет следующую математическую запись.
В общем виде вектор столбец можно задать следующим образом.
>>> v_vert_np = np.array([[1], [2]]) >>> print(v_vert_np) [[1] [2]]
Рассмотрим способы создания нулевых и единичных векторов-столбцов. Построим нулевой вектор-столбец .
>>> v_vert_zeros = np.zeros((5, 1)) >>> print(v_vert_zeros) [[0.] [0.] [0.] [0.] [0.]]
Единичный вектор-столбец можно создать с помощью функции ones() .
>>> v_vert_ones = np.ones((5, 1)) >>> print(v_vert_ones) [[1.] [1.] [1.] [1.] [1.]]
Квадратная матрица
Довольно часто, на практике, приходится работать с квадратными матрицами . Квадратной называется матрица, у которой количество столбцов и строк совпадает. В общем виде они выглядят так.
Создадим следующую матрицу.
В Numpy можно создать квадратную матрицу с помощью метода array() .
>>> m_sqr_arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) >>> print(m_sqr_arr) [[1 2 3] [4 5 6] [7 8 9]]
Как вы уже наверное заметили, аргументом функции np.array() является список Python , его можно создать отдельно и передать в функцию.
>>> m_sqr = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] >>> m_sqr_arr = np.array(m_sqr) >>> print(m_sqr_arr) [[1 2 3] [4 5 6] [7 8 9]]
Но в Numpy есть еще одни способ создания матриц – это построение объекта типа matrix с помощью одноименного метода. Задать матрицу можно в виде списка.
>>> m_sqr_mx = np.matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) >>> print(m_sqr_mx) [[1 2 3] [4 5 6] [7 8 9]]
Также доступен стиль Matlab , когда между элементами ставятся пробелы, а строки разделяются точкой с запятой, при этом такое описание должно быть передано в виде строки.
>>> m_sqr_mx = np.matrix('1 2 3; 4 5 6; 7 8 9') >>> print(m_sqr_mx) [[1 2 3] [4 5 6] [7 8 9]]Диагональная матрица
Особым видом квадратной матрицы является диагональная – это такая матрица, у которой все элементы, кроме тех, что расположены на главной диагонали, равны нулю.
Диагональную матрицу можно построить вручную, задав только значения элементам на главной диагонали.
>>> m_diag = [[1, 0, 0], [0, 5, 0], [0, 0, 9]] >>> m_diag_np = np.matrix(m_diag) >>> print(m_diag_np) [[1 0 0] [0 5 0] [0 0 9]]
Библиотека Numpy предоставляет инструменты, которые могут упростить построение такой матрицы.
Первый вариант подойдет в том случае, если у вас уже есть матрица, и вы хотите сделать из нее диагональную. Создадим матрицу размера 3 3 .
>>> m_sqr_mx = np.matrix('1 2 3; 4 5 6; 7 8 9')Извлечем ее главную диагональ.
>>> diag = np.diag(m_sqr_mx) >>> print(diag) [1 5 9]
Построим диагональную матрицу на базе полученной диагонали.
>>> m_diag_np = np.diag(np.diag(m_sqr_mx)) >>> print(m_diag_np) [[1 0 0] [0 5 0] [0 0 9]]
Второй вариант подразумевает построение единичной матрицы, ей будет посвящен следующий параграф.
Единичная матрица
Единичной матрицей называют такую квадратную матрицу, у которой элементы главной диагонали равны единицы, а все остальные нулю.
Создадим единичную матрицу на базе списка, который передадим в качестве аргумента функции matrix() .
>>> m_e = [[1, 0, 0], [0, 1, 0], [0, 0, 1]] >>> m_e_np = np.matrix(m_e) >>> print(m_e_np) [[1 0 0] [0 1 0] [0 0 1]]
Такой способ не очень удобен, к счастью для нас, для построения такого типа матриц в библиотеке Numpy есть специальная функция – eye() .
>>> m_eye = np.eye(3) >>> print(m_eye) [[ 1. 0. 0.] [ 0. 1. 0.] [ 0. 0. 1.]]
В качестве аргумента функции передается размерность матрицы, в нашем примере – это матрица 3 3 . Тот же результат можно получить с помощью функции identity() .
>>> m_idnt = np.identity(3) >>> print(m_idnt) [[ 1. 0. 0.] [ 0. 1. 0.] [ 0. 0. 1.]]
Нулевая матрица
У нулевой матрицы все элементы равны нулю.
Пример того, как создать такую матрицу с использованием списков, мы приводить не будем, он делается по аналогии с предыдущим разделом. Что касается Numpy , то в составе этой библиотеки есть функция zeros() , которая создает нужную нам матрицу.
>>> m_zeros = np.zeros((3, 3)) >>> print(m_zeros) [[ 0. 0. 0.] [ 0. 0. 0.] [ 0. 0. 0.]]
В качестве параметра функции zeros() передается размерность требуемой матрицы в виде кортежа из двух элементов, первый из которых – число строк, второй – столбцов. Если функции zeros() передать в качестве аргумента число, то будет построен нулевой вектор-строка, это мы делали в параграфе, посвященном векторам.
Задание матрицы в общем виде
Если у вас уже есть данные о содержимом матрицы, то создать ее можно используя списки Python или функцию matrix() из библиотеки Numpy .
>>> m_mx = np.matrix('1 2 3; 4 5 6') >>> print(m_mx) [[1 2 3] [4 5 6]]Если же вы хотите создать матрицу заданного размера с произвольным содержимым, чтобы потом ее заполнить, проще всего для того использовать функцию zeros() , которая создаст матрицу заданного размера, заполненную нулями.
>>> m_var = np.zeros((2, 5)) >>> print(m_var) [[ 0. 0. 0. 0. 0.] [ 0. 0. 0. 0. 0.]]
P.S.
Вводные уроки по “Линейной алгебре на Python” вы можете найти соответствующей странице нашего сайта . Все уроки по этой теме собраны в книге “Линейная алгебра на Python”.
Если вам интересна тема анализа данных, то мы рекомендуем ознакомиться с библиотекой Pandas. Для начала вы можете познакомиться с вводными уроками. Все уроки по библиотеке Pandas собраны в книге “Pandas. Работа с данными”.
Функции автозаполнения, создания матриц и числовых диапазонов
На предыдущем занятии мы познакомились с функцией array для создания произвольных массивов на основе переданного ей списка или кортежа. Однако, часто в инженерных задачах требуется определять векторы или матрицы с типовым набором значений, например, состоящих из нулей или единиц, или определение диагональной и единичной матриц и так далее. Конечно, мы можем все это сделать также через функцию array, используя механизм генерации списков, например, так:
np.array( [0]*10 ) # массив из 10 нулей np.array( [1]*15 ) # массив из 15 единиц np.array( [x for x in range(10)] ) # массив из чисел от 0 до 9
Но есть более быстрые способы (по скорости выполнения) создания подобных массивов. Для этого в NumPyимеются полезные функции, которые мы сейчас рассмотрим.
Функции автозаполнения элементов массива
Это только часть основных функций для создания массивов с заданными значениями. Использовать их достаточно просто. Например, так:
np.empty(10) # создание одномерного массива с произвольными числами np.empty(10, dtype='int16') np.empty((3, 2), dtype='float32') # возвращаетматрицу 3x2 стипомfloat32
Для функций eye и identity размерности указываются отдельными параметрами:
np.eye(4) # матрица 4х4 np.eye(4, 2) # матрица 4x2 np.identity(5) # матрица 5x5
Функции ones, zeros и full работают по аналогии с функцией empty:
np.zeros( (2, 3, 4) ) # нулевая матрица размерностью 2x3x4 np.ones( [4, 3], dtype='int8') # матрица 4x3 из единиц и типом int8 np.full((3, 2), -1) # матрица 3x2, состоящая из -1
Все эти функции работают быстрее, чем функция array с генератором списков языка Python. Поэтому их предпочтительно использовать при создании и инициализации массивов определенными значениями.
Функции создания матриц
Давайте посмотрим как работают эти функции.
np.mat('1 2 3 4') # создает матрицу 1x4 из строки np.mat('1, 2, 3, 4') # то же самое: создает матрицу 1x4 из строки np.mat('1 2; 3 4') # возвращает матрицу 2x2
Или же, вместо строк можно использовать список или кортеж:
np.mat([5, 4, 3]) np.mat( [(1,2,3), (4,5,6)])
Но, если из переданных данных нельзя сформировать прямоугольную таблицу (матрицу), то произойдет ошибка:
np.mat( [(1,2,3), (4,5,6,7)])# ошибка, размерности не совпадают
Следующая функция позволяет формировать диагональные матрицы:
np.diag([1, 2, 3]) # диагональная матрица 3x3
Но, если ей передать двумерный список, то она возвратит одномерный массив из элементов, стоящих на главной диагонали:
np.diag([(1,2,3), (4,5,6), (7,8,9)]) # выделение элементов главной диагонали
Если же мы хотим сформировать диагональную матрицу из многомерных списков или массивов, то следует воспользоваться функцией
np.diagflat([(1,2,3), (4,5,6), (7,8,9)])
Следующий набор функций используются для формирования треугольных матриц. Например:
np.tri(4) # треугольная матрица 4x4 np.tri(4, 2) # треугольная матрица 4x2
Если нужно привести уже существующие матрицы к треугольному виду, то это можно сделать так:
a = np.array( [(1,2,3), (4,5,6), (7,8,9)] ) np.tril(a) # нижняя треугольная матрица размером 3x3 np.triu(a) # верхняя треугольная матрица размером 3x3
Если указать одномерный список:
np.tril([1,2,3])
то будет создана треугольная матрица 3×3 из строк [1, 2, 3].
Также функции tril и triu будут работать и с многомерными массивами:
np.tril([[[1,2,3], [4,5,6], [7,8,9]]]) np.tril([[[1,2,3], [4,5,6], [7,8,9]], [[10,20,30], [40,50,60], [70,80,90]], [[100,200,300], [400,500,600], [700,800,900]]])
В этом случае последние двумерные сечения будут приведены к треугольному виду.
Последняя функция этойгруппы формирует матрицу Вандермонда из одномерных списков или массивов:
np.vander([1,2,3]) # матрица Вандермонда 3x3
Функции формирования числовых диапазонов
Следующая группа функций, которые мы рассмотрим на этом занятии, служит для формирования числовых диапазонов. Что делают эти функции? Когда мы с вами изучали язык Python, то говорили о функции
range(Start, Stop, Step)
Давайте рассмотрим некоторые из них. Первая функция arrange довольно часто применяется в программах на Python. Она позволяет проходить заданный интервал с указанным шагом, например, так:
np.arange(5)# интервал [0; 5) с шагом 1 np.arange(1, 5)# интервал [1; 5) с шагом 1 np.arange(1, 5, 0.5) # интервал [1; 5) с шагом 0,5
Обратите внимание, в отличие от функции range языка Python в arrange пакета NumPy можно указывать вещественные значения. Вот еще один пример, демонстрирующий это:
np.arange(0, np.pi, 0.1)
Здесь все величины вещественные. Мы начинаем движение от значения 0 с шагом 0,1 пока не дойдем до значения пи (не включая его). И, далее, используя этот массив, можно вычислить синус или косинус от всех этих значений:
np.cos(np.arange(0, np.pi, 0.1))
Видите, как это удобно. Без пакета NumPyнам пришлось бы писать цикл и делать вычисление для каждого значения аргумента. А здесь мы сразу получаем готовый массив значений функции косинуса. Это работает гораздо быстрее циклов в Python.
Похожим образом работает и функция linspace. Она разбивает указанный интервал на равномерные отрезки и возвращает массив этих значений:

Мы указываем в качестве аргументов интервал [start; stop] и число отметок в этом интервале n. Если n = 0, то получим пустой массив. При n = 1 – значение start. При n = 2 – значения start и stop. При n> 2 равномерное разбиение интервала точками m = n-2. Например:
np.linspace(0, np.pi, 0) # пустой массив np.linspace(0, np.pi, 1) # одно значение 0 np.linspace(0, np.pi, 2) # два значения: 0 и pi np.linspace(0, np.pi, 3) # три значения: 0, pi/2, pi
В чем отличие linspace от arange? В arange мы указываем сами шаг движения по числовой оси. При этом число значений определяется граничными значениями. А в linspace мы задаем граничные значения и число делений, а шаг вычисляется автоматически.
Функции logspace и geomspace работают аналогичным образом. У них указываются граничные значения и число членов, а на выходе имеем массив из соответствующих величин. Например:
np.logspace(0, 1, 3) # значения: 1, sqrt(10), 10 np.logspace(0, 1, 4) # значения: 1, 2.15, 4.64, 10 np.geomspace(1, 4, 3) # значения: 1, 2, 4 np.geomspace(1, 16, 5) # значения: 1, 2, 4, 8, 16
Остальные функции этой группы используются при построении графиков и мы их рассмотрим, когда будем рассматривать построение графиков с помощью библиотеки matplotlib.
Матрицы в Python и массивы NumPy
Матрица — это двухмерная структура данных, в которой числа расположены в виде строк и столбцов. Например:

Эта матрица является матрицей три на четыре, потому что она состоит из 3 строк и 4 столбцов.
Матрицы в Python
Python не имеет встроенного типа данных для матриц. Но можно рассматривать список как матрицу. Например:
A = [[1, 4, 5], [-5, 8, 9]]
Этот список является матрицей на 2 строки и 3 столбца.

Обязательно ознакомьтесь с документацией по спискам Python, прежде чем продолжить читать эту статью.
Давайте посмотрим, как работать с вложенным списком.
A = [[1, 4, 5, 12], [-5, 8, 9, 0], [-6, 7, 11, 19]] print("A =", A) print("A[1] =", A[1]) # вторая строка print("A[1][2] =", A[1][2]) # третий элемент второй строки print("A[0][-1] =", A[0][-1]) # последний элемент первой строки column = []; # пустой список for row in A: column.append(row[2]) print("3rd column 1" data-ab-test="post_related" data-ab-key="yarpp">Как работают массивы в Python?
