Матрица в Python это двумерная таблица чисел, строки которой хранятся как список списков или как массив NumPy. Вручную ее записывают вложенными списками: matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]], а элемент берут по двум индексам, matrix[1][2] это 6. Для вычислений чаще берут NumPy: там та же матрица создается через np.array(), элемент читается как matrix[1, 2], а сложение, умножение и транспонирование делаются одной строкой.
Сегодня мы поговорим о матрицах в Python. Если вам когда-либо было интересно, как работать с сетками чисел, похожими на те, что вы могли видеть на уроках алгебры, то вы попали по адресу! Матрицы это невероятно полезный инструмент для множества задач, включая обработку данных, решение уравнений и даже машинное обучение. Не волнуйтесь, если это звучит немного сложно; мы разберем это шаг за шагом. Итак, давайте сразу перейдем к делу!
Кратко
- Отдельного типа «матрица» в Python нет. Матрицу собирают из вложенных списков или из массива NumPy.
- У вложенных списков элемент берут двумя индексами:
matrix[1][2], сначала строка, потом столбец. У NumPy работает и короткая записьmatrix[1, 2]. - Пустую матрицу удобно собирать списочным включением:
[[0] * 3 for _ in range(3)]. Запись[[0] * 3] * 3выглядит похоже, но создает три ссылки на одну строку и ломается при первой же правке. - На вложенных списках оператор
+не складывает числа, а склеивает списки. Поэлементные операции приходится писать циклом или брать NumPy. - В NumPy
+и*работают поэлементно, матричное умножение дает оператор@, а транспонирование атрибут.T. - NumPy не входит в стандартную библиотеку, его ставят отдельно:
pip install numpy.
Что такое матрица в Python?
Для начала, что такое матрица? Проще говоря, матрица это прямоугольная сетка чисел, расположенных в строках и столбцах. Вы можете думать о ней как о таблице чисел. Например:
[ [1, 2, 3],
[4, 5, 6],
[7, 8, 9] ]Здесь у нас есть матрица с тремя строками и тремя столбцами. Каждый элемент идентифицируется по его положению в сетке с использованием индексов строк и столбцов. Звучит достаточно просто, не так ли?
Как создать матрицу в Пайтон
Теперь, когда мы знаем, что такое матрица, давайте поговорим о том, как ее создать в Python. Существует несколько способов создания матриц, и мы рассмотрим наиболее распространенные из них:
- Использование вложенных списков
- Использование библиотеки NumPy
- Использование списочных включений
1. Создание матрицы с использованием вложенных списков
Самый простой способ создания матрицы в Python это вложенные списки. Думайте об этом как о списках внутри списков! Никакие библиотеки для этого не нужны, матрица собирается из обычного типа list (все встроенные типы данных в Python разобраны отдельно).
# Создание матрицы с использованием вложенных списков
matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
# Доступ к элементу
print(matrix[1][2]) # Вывод: 6В этом примере мы создаем матрицу с тремя строками и тремя столбцами с использованием вложенных списков. Чтобы получить доступ к элементу, вам нужно использовать два набора квадратных скобок: первый для указания строки, а второй для указания столбца. В этом случае matrix[1][2] дает нам 6, который находится во второй строке и третьем столбце. Вы быстро схватываете, не так ли?
2. Создание матрицы с помощью NumPy
Если вы планируете выполнять серьезные вычисления или научные расчеты, вам определенно следует использовать библиотеку NumPy. NumPy упрощает работу с матрицами.
import numpy as np
# Создание матрицы с помощью NumPy
matrix = np.array([
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
])
# Печать матрицы
print(matrix)
# Доступ к элементу
print(matrix[1, 2]) # Вывод: 6Обратите внимание, насколько чище синтаксис при использовании NumPy? Вы можете использовать np.array() для преобразования списка списков в матрицу, и вы можете легко получить доступ к элементам, указав индексы строк и столбцов. Кроме того, NumPy поставляется со множеством полезных функций для матричных операций, которые мы рассмотрим немного позже.
Зачем использовать NumPy?
NumPy быстрее и эффективнее при работе с большими матрицами по сравнению с вложенными списками. Он также поставляется с кучей полезных функций для выполнения вычислений, таких как сложение матриц, умножение и многое другое. Поверьте мне, как только вы начнете использовать NumPy, вы не захотите возвращаться назад!
3. Создание матрицы с помощью списочных включений
Еще один классный способ создания матрицы это списочные включения. Этот подход особенно полезен, если вам нужно создать матрицу с определенными значениями или нужно инициализировать ее нулями или любым другим значением.
# Создание матрицы 3x3 со всеми нулями
matrix = [[0 for _ in range(3)] for _ in range(3)]
print(matrix)
# Создание матрицы с инкрементными значениями
matrix = [[row * 3 + col + 1 for col in range(3)] for row in range(3)]
print(matrix)В первом примере мы создаем матрицу 3x3, заполненную нулями. Во втором примере мы используем списочные включения для заполнения матрицы инкрементными значениями. Сначала это может показаться немного сложным, но после небольшой практики это становится очень интуитивно понятным. Отличная работа!
По сути списочное включение это сжатый цикл for, который сразу собирает результат в список.
И сразу про грабли, на которые наступают почти все. Матрицу из нулей хочется записать короче, через умножение: [[0] * 3] * 3. Выглядит похоже, но работает иначе: внешнее умножение не копирует строку, а трижды кладет в список ссылку на один и тот же объект. Поменяйте одну ячейку, и изменятся все три строки, после matrix[0][0] = 1 получится [[1, 0, 0], [1, 0, 0], [1, 0, 0]]. Причина в том, что имя в Python указывает на объект, а не хранит его копию. Безопасны два варианта: включение из примера выше или [[0] * 3 for _ in range(3)], где новая строка создается на каждом витке цикла.
Распространенные матричные операции в Питон
Теперь, когда мы знаем, как создавать матрицы, давайте поговорим о некоторых распространенных операциях, которые вам, возможно, захочется выполнить. С Python, особенно с использованием NumPy, эти операции довольно просты:
1. Сложение матриц
С NumPy сложение двух матриц выполняется просто:
import numpy as np
# Определение двух матриц
matrix1 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
matrix2 = np.array([[9, 8, 7], [6, 5, 4], [3, 2, 1]])
# Сложение матриц
result = matrix1 + matrix2
print(result)NumPy позволяет вам просто использовать оператор + для сложения матриц. Это добавит каждый элемент из matrix1 к соответствующему элементу в matrix2. Легко, не правда ли?
2. Умножение матриц
Умножение матриц также очень просто с NumPy. Для этой цели вы можете использовать функцию dot():
# Умножение двух матриц
result = np.dot(matrix1, matrix2)
print(result)Функция dot() умножает строки первой матрицы на столбцы второй матрицы и возвращает результирующую матрицу. Не волнуйтесь, если она покажется вам немного сложной в плане математики; с практикой она станет более понятной!
Одно уточнение про современный синтаксис. С Python 3.5 для матричного умножения есть отдельный оператор @, и запись matrix1 @ matrix2 делает то же самое, что np.dot(). Документация NumPy для dot() прямо говорит, что для двумерных массивов предпочтительнее matmul или a @ b. Обе записи дают одинаковый результат, так что в новом коде лучше брать @.
3. Транспонирование матрицы
Иногда вам может потребоваться транспонировать матрицу, что по сути означает ее переворачивание по диагонали. Вот как это можно сделать с помощью NumPy:
# Транспонирование матрицы
transpose = np.transpose(matrix1)
print(transpose)Функция transpose() делает именно то, что следует из ее названия. Она меняет строки и столбцы местами, что упрощает выполнение операции. У того же действия есть короткая запись: атрибут matrix1.T возвращает ту же транспонированную матрицу, что и np.transpose(matrix1).
Вот те же операции в двух вариантах рядом: на чистом Python и на NumPy. Эта таблица заодно отвечает на вопрос, зачем вообще ставить библиотеку.
| Что нужно сделать | Вложенные списки | NumPy |
| Создать матрицу | m = [[1, 2], [3, 4]] | m = np.array([[1, 2], [3, 4]]) |
| Матрица 3x3 из нулей | [[0] * 3 for _ in range(3)] | np.zeros((3, 3)) |
| Взять элемент | m[1][2] | m[1, 2] |
| Узнать размер | len(m) и len(m[0]) | m.shape |
| Сложить две матрицы | [[a + b for a, b in zip(r1, r2)] for r1, r2 in zip(m1, m2)] | m1 + m2 |
| Перемножить поэлементно | То же выражение, но со * вместо + | m1 * m2 |
| Умножить матрицы | [[sum(a * b for a, b in zip(row, col)) for col in zip(*m2)] for row in m1] | m1 @ m2 |
| Транспонировать | [list(r) for r in zip(*m)] | m.T |
Интерактивные вопросы и ответы
В: Что делать, если мне нужно создать очень большую матрицу, например 1000x1000?
О: Отличный вопрос! Вы можете использовать NumPy для эффективного создания очень больших матриц. Например, чтобы создать матрицу размером 1000x1000, заполненную нулями, можно использовать:
large_matrix = np.zeros((1000, 1000))NumPy обрабатывает большие матрицы гораздо эффективнее, чем вложенные списки, что делает его идеальным выбором для таких задач.
В: Как выполнить поэлементное умножение?
О: Вы можете просто использовать оператор * с массивами NumPy для поэлементного умножения:
elementwise_product = matrix1 * matrix2
print(elementwise_product)Это умножит каждый элемент matrix1 на соответствующий элемент в matrix2.
В: Нужно ли устанавливать NumPy отдельно?
О: Да, NumPy не входит в стандартную библиотеку Python, его ставят командой pip install numpy. Вложенные списки работают без всякой установки, поэтому для небольших матриц и учебных задач их вполне достаточно.
В: Как транспонировать матрицу без NumPy?
О: Через zip с распаковкой: [list(row) for row in zip(*matrix)]. Сам zip(*matrix) отдает кортежи, поэтому list() внутри нужен, если вам нужны именно списки.
В: Почему matrix1 + matrix2 на вложенных списках не складывает числа?
О: Потому что для списков + это склейка: [[1, 2], [3, 4]] + [[5, 6], [7, 8]] даст список из четырех строк, а не матрицу с суммами. Поэлементное сложение дает либо NumPy, либо выражение со zip из таблицы выше.
В: Как узнать размер матрицы?
О: У вложенных списков число строк это len(matrix), а число столбцов len(matrix[0]). У NumPy есть готовый атрибут matrix.shape, он возвращает кортеж вида (3, 3).
Краткое содержание
И вот вам руководство для начинающих по работе с матрицами в Python! Сегодня мы рассмотрели:
- Что такое матрица и почему она полезна.
- Различные способы создания матрицы в Python, включая вложенные списки, NumPy и списочные включения.
- Распространенные операции, такие как сложение, умножение и транспонирование матриц.
Сначала матрицы могут показаться немного сложными, но с небольшой практикой вы будете работать с ними как профессионал. Продолжайте экспериментировать и не бойтесь совершать ошибки, это лучший способ учиться. У вас получается потрясающе, и я уверен, что вы освоите матрицы в кратчайшие сроки!
Читайте также: