Как создать матрицу в python
Перейти к содержимому

Как создать матрицу в python

  • автор:

Массивы (матрицы) в Python

Python_Deep_14.3_site-5020-9131b4.png

Python — популярный и динамический язык программирования. Он позволяет решать разные задачи по разработке ПО, при выполнении которых часто используются массивы. С их помощью вы сможете добавить однотипные данные и избежать дублирования кода.

Одномерные массивы в Python представляют собой список элементов. Значения указываются внутри квадратных скобок, где перечисляются через запятую. Как правило, любой элемент можно вызвать по индексу и присвоить ему новое значение.

Массив строк в Python:

Чтобы возвратить число элементов внутри списка, используют функцию len() :

Когда нужно перечислить элементы массива, применяют цикл for . В «Питоне» этот цикл перебирает элементы, а не индексы, как в Pascal:

Идём дальше. Создать и добавить цикл в Python можно с помощью генератора заполнения списков. Записывается он в следующем виде: [значение массива for имя переменной in число элементов];

Если говорить про создание не одномерного, а двумерного массива, то он в Python создаётся путём использования вложенных генераторов, и выглядит это так:

matrix_python-20219-889f47.jpg

Как создаются матрицы в Python?

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

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

Функция array() — один из самых простых способов, позволяющих динамически задать одно- и двумерный массив в Python. Она создаёт объект типа ndarray :

Для проверки используется функция array.type() — принимает в качестве аргумента имя массива, который был создан.

Если хотите сделать переопределение типа массива, используйте на стадии создания dtype=np.complex :

Когда стоит задача задать одномерный или двумерный массив определённой длины в Python, и его значения на данном этапе неизвестны, происходит его заполнение нулями функцией zeros() . Кроме того, можно получить матрицу из единиц через функцию ones() . При этом в качестве аргументов принимают число элементов и число вложенных массивов внутри:

К примеру, так в Python происходит задание двух массивов внутри, которые по длине имеют два элемента:

Если хотите вывести одно- либо двумерный массив на экран, вам поможет функция print() . Учтите, что если матрица слишком велика для печати, NumPy скроет центральную часть и выведет лишь крайние значения. Дабы увидеть массив полностью, используется функция set_printoptions() . При этом по умолчанию выводятся не все элементы, а происходит вывод только первой тысячи. И это значение массива указывается в качестве аргумента с ключевым словом threshold.

Базовые операции в NumPy

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

Если выполнить array1 + array2, компилятор скажет об ошибке, а всё потому, что размер первого matrix равен двум, а второго трём.

В данном случае array1 + array2 вернёт нам массив со следующими элементами: 2, 4, 8, 11. Здесь не возникнет ошибки, т. к. матрицы имеют одинаковые размеры. Причём вместо ручного сложения часто применяют функцию, входящую в класс ndarray sum() :

В ndarray входит большая библиотека методов, необходимых для выполнения математических операций.

Форма матрицы в Python

Lenght matrix (длина матрицы) в Python определяет форму. Длину матрицы проверяют методом shape() .

Массив с 2-мя либо 3-мя элементами будет иметь форму (2, 2, 3). И это состояние изменится, когда в shape() будут указаны аргументы: первый — число подмассивов, второй — размерность каждого подмассива.

Те же задачи и ту же операцию выполнит reshape() . Здесь lenght и другие параметры matrix определяются числом столбцов и строк.

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

Операции со срезами matrix в Python

Часто мы работаем не с целым массивом, а с его компонентами. Эти операции выполняются с помощью метода слайс (срез). Он пришел на замену циклу for, при котором каждый элемент подвергался перебору. Метод позволяет получать копии matrix, причём манипуляции выполняются в виде [start:stop:step] . В данном случае start — индекс элемента, с которого берётся отсчёт, stop — последний элемент, step — размер шага или число пропускаемых значений элемента при каждой итерации. Изначально start равен нулю, stop — индексу последнего элемента, step — единице. Если выполнить операции без аргументов, копирование и добавление списка произойдёт полностью.

Допустим, имеем целочисленный массив otus = [1, 2, 3, 4] . Для копирования и вывода используем otus[:] . В итоге произойдёт вывод последовательности [1, 2, 3, 4]. Но если аргументом станет отрицательное значение, допустим, -2, произойдёт вывод уже других данных:

Возможны и другие операции. Например, если добавить ещё одно двоеточие, будет указан шаг копируемых элементов. Таким образом, otus[::2] позволит вывести матрицу [1, 3].

Если ввести отрицательное значение, к примеру, [::-2] отсчёт начнётся с конца, и в результате произойдёт вывод [3, 1]. Остаётся добавить, что метод среза позволяет гибко работать с матрицами и вложенными списками в Python.

Хотите узнать гораздо больше? Записывайтесь на курс «Разработчик Python»!

Python Matrix — учебное пособие по матрицам

Мы можем реализовать матрицу Python в форме 2-го списка или 2-го массива. Для выполнения операций с Python Matrix нам необходимо импортировать Python NumPy Module.

Matrix важен в области статистики, обработки данных, обработки изображений и т. д.

Python Matrix объяснение

Создание матрицы Python

Матрицу Python можно создать одним из следующих способов:

  • Используя списки
  • Используя метод arange()
  • и метода matrix()

1 С использованием списков

numpy.array() можно использовать для создания массива, используя списки в качестве входных данных.

Как видно выше, выходные данные представляют собой двумерную матрицу с заданным набором входных данных в виде списка.

2 С помощью функции numpy.arange()

numpy.arange() вместе со списком входов.

3 С помощью функции numpy.matrix().

Функция numpy.matrix() , ее синтаксис:

  • input: элементы input для формирования матрицы.
  • dtype: тип данных соответствующего вывода.

Сложение

Операцию сложения матриц можно выполнить следующими способами:

  • Традиционный метод
  • Используя оператор ‘+’

1 Традиционный метод

В этом традиционном методе мы в основном берем ввод от пользователя, а затем выполняем операцию сложения с использованием циклов for (для обхода элементов матрицы) и оператора ‘+’.

Примечание. Matrix.shape возвращает размеры конкретной матрицы.

2 Использование оператора «+»

Этот метод обеспечивает большую эффективность кода, поскольку он уменьшает LOC (количество строк кода) и, таким образом, оптимизирует код.

Умножение матриц

Умножение матриц в Python можно обеспечить следующими способами:

  • Скалярное произведение;
  • Матричный продукт.

Скалярное произведение

В скалярном произведении постоянное значение умножается на каждый элемент матрицы.

Оператор ‘*’ используется для умножения скалярного значения на элементы входной матрицы.

Функция numpy.dot()

Как упоминалось выше, мы можем использовать оператор ‘*’ только для скалярного умножения. Чтобы продолжить умножение матриц, нам нужно использовать numpy.dot() .

Функция numpy.dot() принимает массивы NumPy в качестве значений параметров и выполняет умножение в соответствии с основными правилами умножения матриц.

Вычитание

Оператор ‘-‘ используется для выполнения вычитания матриц.

Деление

Скалярное деление может выполняться на элементах матрицы в Python с помощью оператора ‘/’.

Оператор ‘/’ делит каждый элемент матрицы на скалярное / постоянное значение.

Транспонирование матрицы

Транспонирование матрицы в основном включает в себя переворачивание матрицы по соответствующим диагоналям, т. е. Меняет местами строки и столбцы входной матрицы. Строки становятся столбцами и наоборот.

Например: давайте рассмотрим матрицу A с размерами 3 × 2, т.е. 3 строки и 2 столбца. После выполнения операции транспонирования размеры матрицы A будут 2 × 3, т.е. 2 строки и 3 столбца.

Matrix.T основном выполняет транспонирование входной матрицы и создает новую в результате операции транспонирования.

В приведенном выше фрагменте кода я создал матрицу размером 2 × 5, т.е. 2 строки и 5 столбцов.

После выполнения операции транспонирования размеры результирующей матрицы составляют 5 × 2, то есть 5 строк и 2 столбца.

Экспонента

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

В приведенном выше фрагменте кода мы выяснили показатель степени каждого элемента входной матрицы, возведя его в степень 2.

Операция умножения с использованием методов NumPy

Для выполнения умножения матрицы NumPy можно использовать следующие методы:

Библиотека numpy ¶

Пакет numpy предоставляет $n$-мерные однородные массивы (все элементы одного типа); в них нельзя вставить или удалить элемент в произвольном месте. В numpy реализовано много операций над массивами в целом. Если задачу можно решить, произведя некоторую последовательность операций над массивами, то это будет столь же эффективно, как в C или matlab — львиная доля времени тратится в библиотечных функциях, написанных на C .

Замечание. Модуль numpy.random не рассматривается целенаправленно. Вместо него рассмотри модуль scipy.stats , который больше подходит под вероятностно-статистические задачи.

Можно преобразовать список в массив.

print печатает массивы в удобной форме.

Класс ndarray имеет много методов.

Наш массив одномерный.

size — это полное число элементов в массиве; len — размер по первой координате (в 1-мерном случае это то же самое).

numpy предоставляет несколько типов для целых ( int16 , int32 , int64 ) и чисел с плавающей точкой ( float32 , float64 ).

Массив чисел с плавающей точкой.

Точно такой же массив.

Индексировать массив можно обычным образом.

Массивы — изменяемые объекты.

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

Упражнение: создайте numpy-массив, состоящий из первых пяти простых чисел, выведите его тип и размер.

Решение:

Массивы, заполненные нулями или единицами. Часто лучше сначала создать такой массив, а потом присваивать значения его элементам.

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

Функция arange подобна range . Аргументы могут быть с плавающей точкой. Следует избегать ситуаций, когда (конец-начало)/шаг — целое число, потому что в этом случае включение последнего элемента зависит от ошибок округления. Лучше, чтобы конец диапазона был где-то посредине шага.

Последовательности чисел с постоянным шагом можно также создавать функцией linspace . Начало и конец диапазона включаются; последний аргумент — число точек.

Упражнение: создайте и выведите последовательность чисел от 10 до 20 с постоянным шагом, длина последовательности — 21.

Решение:

Последовательность чисел с постоянным шагом по логарифмической шкале от $10^0$ до $10^1$.

Арифметические операции проводятся поэлементно.

Библиотека numpy содержит элементарные функции, которые тоже применяются к массивам поэлементно. Они называются универсальными функциями ( ufunc ).

Один из операндов может быть скаляром, а не массивом.

Сравнения дают булевы массивы.

Кванторы "существует" и "для всех".

Модификация на месте.

При выполнении операций над массивами деление на 0 не возбуждает исключения, а даёт значения np.nan или np.inf .

Сумма и произведение всех элементов массива; максимальный и минимальный элемент; среднее и среднеквадратичное отклонение.

Имеются встроенные функции

Иногда бывает нужно использовать частичные (кумулятивные) суммы. В наших курсах такое может пригодится.

Функция sort возвращает отсортированную копию, метод sort сортирует на месте.

Расщепление массива в позициях 3 и 6.

Функции delete , insert и append не меняют массив на месте, а возвращают новый массив, в котором удалены, вставлены в середину или добавлены в конец какие-то элементы.

Есть несколько способов индексации массива. Вот обычный индекс.

Диапазон индексов. Создаётся новый заголовок массива, указывающий на те же данные. Изменения, сделанные через такой массив, видны и в исходном массиве.

Диапазон с шагом 2.

Массив в обратном порядке.

Подмассиву можно присвоить значение — массив правильного размера или скаляр.

Тут опять создаётся только новый заголовок, указывающий на те же данные.

Чтобы скопировать и данные массива, нужно использовать метод copy .

Можно задать список индексов.

Можно задать булев массив той же величины.

Упражнение:
1). Создайте массив чисел от $-2\pi$ до $2\pi$.

2). Посчитайте сумму поэлементных квадратов синуса и косинуса для данного массива.

3). С помощью np.all проверьте, что в ответе только единицы.

Решение:

Атрибуту shape можно присвоить новое значение — кортеж размеров по всем координатам. Получится новый заголовок массива; его данные не изменятся.

Можно растянуть в одномерный массив

Арифметические операции поэлементные

Поэлементное и матричное (только в Python >=3.5) умножение.

Упражнение: создайте матрицы $\begin -3 & 4 \\ 4 & 3 \end$ и $\begin 2 & 1 \\ 1 & 2 \end$. Посчитайте их поэлементное и матричное произведения.

Решение:

Умножение матрицы на вектор.

Если у вас Питон более ранней версии, то для работы с матрицами можно использовать класс np.matrix , в котором операция умножения реализуется как матричное умножение.

Внешнее произведение $a_=u_i v_j$

Двумерные массивы, зависящие только от одного индекса: $x_=u_j$, $y_=v_i$

Метод reshape делает то же самое, что присваивание атрибуту shape .

Цикл по строкам.

Можно построить двумерный массив из функции.

Соединение матриц по горизонтали и по вертикали.

Сумма всех элементов; суммы столбцов; суммы строк.

Аналогично работают prod , max , min и т.д.

След — сумма диагональных элементов.

Упражнение:

в статистике и машинном обучении часто приходится иметь с функцией $RSS$, которая вычисляется по формуле $\sum_^ (y_i — a_i)^2$, где $y_i$ — координаты одномерного вектора $y$, $a_i$ — координаты одномерного вектора $a$. Посчитайте $RSS$ для $y = (1, 2, 3, 4, 5), a = (3, 2, 1, 0, -1)$.

Решение:

Суммирование (аналогично остальные операции)

Массивы можно объединять друг с другом по разным осям

Не обязательно объединять массивы одинакового размера

Однако начинают возникать проблемы, когда мы хотим объединить одномерный массив с двумерным.

С этой проблемой может помочь функция np.newaxis

Функция np.stack умеет объединять массивы по несуществующим осям, однако она принимает только массивы одинаковой размерности.

4.3. Broadcasting¶

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

Произошло поэлементное умножение, все элементы массива $a$ умножились на $2$. Но мы знаем, что это можно сделать проще, просто умножив массив на $2$.

На самом деле поведение будет аналогичным, если умножить одномерный массив на массив длины $1$.

В этом случае работает так называемый broadcasting. Один массив "растягивается", чтобы повторить форму другого.

Такой же эффект работает и для многомерных массивов. Если по какому-то измерению размер у одного массива равен $1$, а у другого — произвольный, то по этому измерению может произойти "рястяжение". Таким образом, массивы можно умножать друг на друга, если в измерениях, где они по размеру не совпадают, хотя бы у одного размер $1$. Для других поэлементных операций правило аналогично.

Важно отметить, что размерности сопоставляются справа налево. Если их количество не совпадает, что массивы меньшей размерности сначала дополняются слева размерностями 1. Например, при сложении массива размера $4 \times 3$ с массивом размера $3$ последний сначала преобразуется в массив размера $1 \times 3$.

Схематично проведенную операцию можно визуализировать следующим образом.

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

Упражнение:

Подумайте, массив какого размера получится, если перемножить массив $4 \times 1 \times 3$ и массив $12 \times 1$. Убедитесь на практике в правильности вашего ответа.

Знать про broadcasting нужно, но пользоваться им надо с осторожностью. Многократное копирование массива при растяжении может привести к неэффективной работе программы по памяти. Особенно за этим приходится следить при работе с GPU.

Решение линейной системы $au=v$.

Собственные значения и собственные векторы: $a u_i = \lambda_i u_i$. l — одномерный массив собственных значений $\lambda_i$, столбцы матрицы $u$ — собственные векторы $u_i$.

Функция diag от одномерного массива строит диагональную матрицу; от квадратной матрицы — возвращает одномерный массив её диагональных элементов.

Все уравнения $a u_i = \lambda_i u_i$ можно собрать в одно матричное уравнение $a u = u \Lambda$, где $\Lambda$ — диагональная матрица с собственными значениями $\lambda_i$ по диагонали.

Поэтому $u^ <-1>a u = \Lambda$.

Найдём теперь левые собственные векторы $v_i a = \lambda_i v_i$. Собственные значения $\lambda_i$ те же самые.

Собственные векторы нормированы на 1.

Левые и правые собственные векторы, соответствующие разным собственным значениям, ортогональны, потому что $v_i a u_j = \lambda_i v_i u_j = \lambda_j v_i u_j$.

Упражнение:

в машинном обучении есть модель линейной регрессии, для которой "хорошее" решение считается по следующей формуле: $\widehat <\theta>= (X^T \cdot X + \lambda \cdot I_n)^<-1>\cdot X^T y$. Вычислите $\widehat<\theta>$ для $ X = \begin -3 & 4 & 1 \\ 4 & 3 & 1 \end$, $y = \begin 10 \\ 12 \end$, $I_n$ — единичная матрица размерности 3, $\lambda = 0.1$.

Решение:

Адаптивное численное интегрирование (может быть до бесконечности). err — оценка ошибки.

Получится такой файл

Теперь его можно прочитать

8. Производительность numpy¶

Посмотрим на простой пример — сумма первых $10^8$ чисел.

Немного улучшеный код

Код с использованием функций библиотеки numpy

Простой и понятный код работает в $30$ раз быстрее!

Посмотрим на другой пример. Сгенерируем матрицу размера $500\times1000$, и вычислим средний минимум по колонкам.

Простой код, но при этом даже использующий некоторые питон-функции

Замечание. Далее с помощью scipy.stats происходит генерация случайных чисел из равномерного распределения на отрезке $[0, 1]$. Этот модуль будем изучать в следующем ноутбуке.

Понятный код с использованием функций библиотеки numpy

Простой и понятный код работает в 1500 раз быстрее!

С помощью соглашения Эйнштейна о суммировании, многие общие многомерные линейные алгебраические операции с массивами могут быть представлены простым способом.

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

Например, выражение $c_j = a_i b^i_j$ понимается как $c_j = \sum_^n a_i b^i_j$.

Подобные операции часто возникают в анализе данных, в особенности при реализации байесовских методов.

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

Разберем на примере выше. В данном случае сигнатура имеет вид i,ji->j . Элементы сигнатуры последовательно означают следующее (тензор = многомерная матрица):

Как работать с матрицами в Python

Матрица — это двумерный массив, состоящий из M строк и N столбцов. Матрицы часто используются в математических вычислениях. Программисты работают с матрицами в основном в научной области, однако их можно использовать и для других вещей, например, для быстрой генерации уровней в видео-игре.

Матрицы и библиотека NumPy

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

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

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

Подключение библиотеки NumPy

NumPy не встроена в интерпретатор Python, поэтому перед импортом её необходимо установить. Для этого в можно воспользоваться утилитой pip. Введите в консоле команду:

Теперь, когда библиотека установлена, её можно подключить с помощью команды import . Для удобства переименуем numpy при импорте в np следующим образом:

Создание

Для создании матрицы используется функция array(). В функцию передаётся список. Вот пример создания, мы подаём в качестве аргумента функции двумерный список:

Вторым параметром можно задать тип элементов матрицы:

Тогда в консоль выведется:

Обратите внимание, что если изменить int на str, то тип элементов изменился на строковый. Кроме того, при выводе в консоль NumPy автоматически отформатировал вывод, чтобы он выглядел как матрица, а элементы располагались друг под другом.

В качестве типов элементов можно использовать int, float, bool, complex, bytes, str, buffers. Также можно использовать и другие типы NumPy: логические, целочисленные, беззнаковые целочисленные, вещественные, комплексные. Вот несколько примеров:

  • np.bool8 — логическая переменная, которая занимает 1 байт памяти.
  • np.int64 — целое число, занимающее 8 байт.
  • np.uint16 — беззнаковое целое число, занимающее 2 байта в памяти.
  • np.float32 — вещественное число, занимающее 4 байта в памяти.
  • np.complex64 — комплексное число, состоящее из 4 байтового вещественного числа действительной части и 4 байтов мнимой.

Вы также можете узнать размер матрицы, для этого используйте атрибут shape:

Первое число (2) — количество строк, второе число (3) — количество столбцов.

Нулевая матрица

Если необходимо создать матрицу, состоящую только из нулей, используйте функцию zeros():

Результат этого кода будет следующий:

Получение строки, столбца и элемента

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

Получить столбец уже не так просто. Используем срезы, в качестве первого элемента среза мы ничего не указываем, а второй элемент — это номер искомого столбца. Пример:

Чтобы получить элемент, нужно указать номер столбца и строки, в которых он находится. Например, элемент во 2 строке и 3 столбце — это 5, проверяем (помним, что нумерация начинается с 0):

Умножение и сложение

Чтобы сложить матрицы, нужно сложить все их соответствующие элементы. В Python для их сложения используется обычный оператор «+».

Пример сложения:

Результирующая матрица будет равна:

Важно помнить, что складывать можно только матрицы с одинаковым количеством строк и столбцов, иначе программа на Python завершится с исключением ValueError.

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

Умножение в NumPy выполняется с помощью метода dot().

Пример умножения:

Результат выполнения этого кода будет следующий:

Транспонированная и обратная

Транспонированная матрица — это матрица, у которой строки и столбцы поменялись местами. В библиотеки NumPy для транспонирования двумерных матриц используется метод transpose(). Пример:

В результате получится матрица:

Чтобы получить обратную матрицу, необходимо использовать модуль linalg (линейная алгебра). Используем функцию inv():

Результирующая матрица будет равна:

Получение максимального и минимального элемента

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

NumPy позволяет найти максимальный и минимальный элемент с помощью функций amax() и amin(). В качестве аргумента в функции нужно передать саму матрицу. Пример:

Как видим, результаты реализации на чистом Python и реализации с использованием библиотеки NumPy совпадают.

Заключение

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *