В этом рассказе и следующих частях мы исследуем матрицы математически и с точки зрения программирования (Python). Построим полное понимание концепции с нуля. Будет очень весело и интересно, если вы сами напишете весь код по мере чтения, и даже если у вас уже есть некоторый опыт работы с python. Следите за обновлениями до последней части, где мы будем писать собственные классы.

Прежде чем мы начнем, важно знать, что Python не имеет встроенной поддержки матриц, таких как языки, которые позволяют нам создавать многомерные массивы (C, C ++, Java и т. Д.). Python обеспечивает аналогичное поведение, используя вложенные списки.

В этой части мы сосредоточимся на построении матриц со структурой данных list в python, чтобы получить базовое представление о построении матриц. В следующих частях обсуждаются операции, использование библиотеки Numpy, а также создание нашей собственной библиотеки для работы с матрицами.

Примечание о структуре исходного кода:
Весь код доступен на github. Будет два файла:
1. Notebook: содержит тестовый код
2. matrix.py: скрипт, содержащий все определения функций.

Массивы

Рассмотрим последовательность из четырех чисел.
1 2 3 4

Назовем его A.. Теперь этот элемент A обычно называется Array , а в Python - с помощью list или кортежа. Этот массив A имеет длину 4. Обозначим его длину как n. . Итак, для A, n = 4. В приведенном ниже коде показан пример использования как списка, так и кортежа.

В Python, если мы хотим получить доступ к отдельному элементу этого массива или сослаться на него, это делается с помощью числа, называемого index, для обозначения позиции этого элемента в массиве. Индексы в Python начинаются с нуля, поэтому для приведенного выше списка / кортежа, поскольку n = 4 индекс первого элемента равен 0, а последний - 3. Код ниже печатает все элементы из списка с помощью индексов.

Поскольку списки могут содержать произвольное количество элементов, мы записываем все операции со списками с помощью циклов. Ниже представлена ​​обновленная версия предыдущего кода.

Предыдущий код использует цикл for на основе диапазона для индексации элементов. Чтобы переписать лучше и более питоническим способом, см. Приведенный ниже код (вы также можете использовать цикл while):

В большинстве следующих примеров мы увидим тот или иной способ написания кода для доступа к элементам матрицы или массива. Тем не менее, важно знать индексирование, чтобы лучше понимать операции с матрицами, поэтому больше внимания будет уделяться циклам, которые используют индексы для любых видов матричных операций.

Практика: напишите код для печати элементов в обратном порядке.

Матрицы

Матрица - это последовательность чисел в двух измерениях. В отличие от массивов (также называемых векторами в математике), которые имеют одно измерение, то есть длину или размер, матрица имеет строки и столбцы. Матрица выглядит как прямоугольный блок чисел, содержащий m строк и n столбцов.

В математике матрица выглядит так.

M имеет 2 строки и 3 столбца. В первой строке содержится [10 20 30], а в первом столбце - [10 -5]. Важно визуализировать матрицы в том виде, в каком они записаны в их математической обработке. M - это матрица 2 x 3 (читается как два на три). [Примечание: иногда также называется «матрица два на три»]

В общем случае матрица имеет размерность m x n (m cross n). m - количество строк (по горизонтали), n - количество столбцов (по вертикали).

Доступ к элементам

Для доступа к одному элементу или матрице необходимо указать позиции строк и столбцов. Поэтому для ссылки на элемент в первой строке и первом столбце матрицы M мы обозначаем его как M ₁₁ = 10

Обычно используется формат M ᵢⱼ , где i - номер строки, а j - номер столбца. В математической обработке числа (номера строк и столбцов) начинаются с 1, а не с нуля. Таким образом, последний элемент 40 будет обозначаться как M₂₃.

Переход к Python. Чтобы представить это в Python, нам нужно создать список list.

Для доступа к элементам нам теперь нужны два индекса: один для внешнего списка, а другой - для внутреннего. Поскольку индексы начинаются с нуля, внешний индекс находится в диапазоне от 0 до 1 (индекс строки), а внутренний индекс имеет диапазон от 0 до 2 (индекс столбца).
Таким образом, к первому элементу (вверху слева) можно получить доступ как M [0] [0] и последний как M [1] [2] вместо M ₁₁ и M₂₃ соответственно.

Чтобы напечатать количество строк и столбцов, используйте функцию len ().
Для строк получите len () всей матрицы M, поскольку количество строк - это количество списков во внешнем списке. Для столбцов проверьте длину внутреннего списка.

Чтобы получить доступ к одной полной строке, скажем, второй строке (т.е. индекс 1), сделайте следующее.

или если вы печатаете элементы второй строки по отдельности, тогда

Распечатать столбец не так просто, поскольку единственный способ получить доступ к данным - через индексы. Это связано с тем, как мы представляли данные в Python, то есть по строкам. Итак, для печати элементов первого столбца единственный способ:

Практика: попробуйте увидеть, что дает вам M [0] [:]

Элементный доступ в Python

См. Ниже код для печати всех элементов матрицы M один за другим в большой строке.

В приведенном выше коде используются вложенные циклы for для печати всех элементов по строкам. Но результат не похож на матрицу. Для печати в матричном формате нам необходимо использовать некоторые возможности функции печати. См. Следующий фрагмент кода.

Если вы не понимаете вышеупомянутые вложенные циклы, просмотрите измененный код ниже, который печатает индексы вместо данных. Это помогает понять, как манипулируют индексами.

Полировка существующего кода

Давайте обновим наш код так, чтобы вместо ввода значений непосредственно в код я хотел написать программу для ввода размеров матрицы и ее данных от самого пользователя. Это можно сделать разными способами. Один из способов, показанный ниже, берет данные от пользователя строка за строкой.

Вы видите, что для каждой матрицы, которую мы создаем или будем создавать, нам нужно будет ее распечатать. Давайте переместим код в функцию и сделаем его многоразовым, чтобы нам не приходилось писать один и тот же код для печати снова и снова.

Аналогичным образом матричный ввод также можно переместить в функцию:

Рекомендуется поместить указанные выше 2 функции в отдельный скрипт Python matrix.py и поместить этот скрипт в ту же папку, что и ваш блокнот Jupyter, или в ту же папку, где присутствуют другие ваши скрипты. Это позволяет вам импортировать код из matrix.py и повторно использовать эти функции.
После этого кода для ввода и печати матрица будет выглядеть так:

Давайте добавим еще несколько полезных функций в наш matrix.py; функции для создания матриц нулей и единиц. Эти функции примут форму матрицы и создадут матрицу с определенными размерами. Обычно функция для создания матрицы нулей будет выглядеть так:

Но на этот раз для этого я воспользуюсь списком. Итак, новый код для создания матриц нулей или единиц со списком выглядит примерно так:

Аналогичным образом мы определяем функцию copy () для копирования любой матрицы:

Перед тем, как перейти к следующему разделу, давайте рассмотрим все, что есть в matrix.py. Прямо сейчас у него есть функции для печати и ввода матриц, создания матриц нулей и единиц, а также метод создания копии матрицы. Обязательно заполните свой файл matrix.py, поскольку мы будем использовать все эти функции в следующих разделах.

Специальные матрицы

В зависимости от размерности матриц у нас могут быть следующие особые виды матриц:

Квадратная матрица

Квадратная матрица - это матрица, которая имеет одинаковое количество строк и столбцов.
Есть несколько свойств, связанных с квадратными матрицами, которые мы увидим в следующих разделах.

Вектор строки

Вектор-строка - это матрица, в которой количество строк равно единице.
т.е. матрица 1 x n.

При письме ручкой и бумагой вектор-строка выглядит просто так.

Но представление с использованием списков Python может быть немного сложным. Хотя его можно представить просто одним списком. Но для совместимости наших функций в python мы представляем его как список, содержащий единственный список (вложенный список).

Столбец вектор

Теперь очевидно, что это матрица с одним столбцом, но несколько строк станут вектором столбца. т.е. размер будет м x 1

Мудрое представление выглядит так. Но опять же для совместимости мы представляем его в python в виде списка, содержащего несколько подсписок с отдельными элементами.

Теперь давайте посмотрим на код для создания этих матриц. Вы можете использовать функции, которые мы определили в предыдущих разделах, для создания векторов строк или столбцов из нулей и единиц.

Вывод предыдущего кода не очень похож на матрицу, поскольку в нем отсутствуют скобки, но это должно быть нормально ... по крайней мере, для меня, поскольку меня больше беспокоит функциональность. Если вы хотите поставить какие-то скобки или сделать это своими руками, вы можете приложить некоторые усилия для этой задачи по отображению скобок вокруг данных матрицы. Это было бы совсем другое обучение. Чтобы получить некоторую помощь, ознакомьтесь с приведенным ниже кодом и запустите его самостоятельно.

И это все об основах. Окончательный вариант matrix.py будет выглядеть так:

def print_matrix(mat):
  for i in range( len(mat) ):
    for j in range( len(mat[i]) ):
      print( mat[i][j] , end = ' ')
    print()
def input_matrix(m, n):
    mat = []
    for i in range(m):
        row = []
        for j in range(n):
           num = input("Enter element (%d,%d):" % (i,j) )
           row.append(num)
        mat.append(row)
    return mat
def zeros(m,n):
    mat = []# TODO: Try putting in some dimension check for m and n.
    for i in range(m):
        row = []
        for j in range(n):
            row.append(0)
        mat.append(row)
    return mat
def zeros(m,n):
    mat = [ [0 for j in range(n)] for i in range(m) ]
    return mat
def ones(m,n):
    mat = [ [1 for j in range(n)] for i in range(m) ]
    return mat
def copy(mat):
    return [ [data for data in row] for row in mat]

Исходный код на github.

Далее: Матрица в Python-Part2