Операции с матрицами в Python с NumPy: транспонирование, сложение, умножение и срезы — практическое руководство
Операции с матрицами в Python с NumPy
Математическое моделирование, научные вычисления и анализ данных часто опираются на эффективную манипуляцию двумерными данными. В Python матрицы можно создавать с обычными списками или, более мощно, с библиотекой NumPy. Это руководство проведёт вас через самые распространённые операции с матрицами, с понятными примерами кода и советами по лучшим практикам.
Что такое матрица?
Матрица — прямоугольный массив чисел (или других типов данных), организованный в строки и столбцы. Хотя в ядре Python нет специализированного типа матрицы, её можно представить вложенными списками или массивом ndarray NumPy, который предлагает быстрые, векторизованные операции.
Создание матрицы с вложенными списками
Вложенные списки — самый простой способ построить матрицу. Каждый внутренний список представляет строку:
# 3x3 матрица
M1 = [[8, 14, -6], [12, 7, 4], [-11, 3, 21]]
print(M1)
Вывод:
[[8, 14, -6], [12, 7, 4], [-11, 3, 21]]
Чтение данных
Доступ к элементам через индексы строки и столбца. Для печати последнего элемента каждой строки:
for row in M1:
print(row[-1])
Вывод:
-6 4 21
Сложение матриц
Когда обе матрицы имеют одинаковую форму, поэлементное сложение простое:
M2 = [[3, 16, -6], [9, 7, -4], [-1, 3, 13]]
# Результирующая матрица
M3 = [[M1[i][j] + M2[i][j] for j in range(len(M1[0]))] for i in range(len(M1))]
print(M3)
Вывод:
[[11, 30, -12], [21, 14, 0], [-12, 6, 34]]
Поэлементное умножение
Аналогично можно перемножать соответствующие элементы:
M3 = [[M1[i][j] * M2[i][j] for j in range(len(M1[0]))] for i in range(len(M1))]
print(M3)
Вывод:
[[24, 224, 36], [108, 49, -16], [11, 9, 273]]
Использование NumPy для эффективных операций с матрицами
NumPy предоставляет специализированный тип массива и множество векторизованных операций. Установите с pip install numpy и импортируйте как np:
import numpy as np
Создание матрицы
M1 = np.array([[5, -10, 15], [3, -6, 9], [-4, 8, 12]])
print(M1)
Вывод:
[[ 5 -10 15] [ 3 -6 9] [ -4 8 12]]
Базовые операции
- Сложение:
M3 = M1 + M2 - Вычитание:
M3 = M1 - M2 - Скалярное произведение (умножение матриц):
M3 = M1.dot(M2) - Транспонирование:
M2 = M1.transpose()
Пример: скалярное произведение матриц
M1 = np.array([[3, 6], [5, -10]])
M2 = np.array([[9, -18], [11, 22]])
print(M1.dot(M2))
Вывод:
[[ 93 78] [-65 -310]]
Срезы (slicing)
Срезы строк и столбцов с array[row_start:row_end, col_start:col_end]:
M = np.array([[2, 4, 6, 8, 10],
[3, 6, 9, -12, -15],
[4, 8, 12, 16, -20],
[5, -10, 15, -20, 25]])
print(M[1:3, 1:4]) # строки 1–2, столбцы 1–3
print(M[:, 3]) # все строки, 4-й столбец
print(M[:1, :]) # первая строка, все столбцы
print(M[:3, :2]) # первые 3 строки, первые 2 столбца
Вывод:
[[ 6 9 -12] [ 8 12 16]] [ 8 -12 16 -20] [[ 2 4 6 8 10]] [[ 2 4] [ 3 6] [ 4 8]]
Доступ к строкам и столбцам
# Строки
print(M[0]) # первая строка
print(M[-1]) # последняя строка
# Столбцы
print(M[:, 0]) # первый столбец
print(M[:, -1]) # последний столбец
Ключевые выводы
- Список списков в Python подходит для малых матриц, но NumPy
ndarrayмасштабируется гораздо лучше. - Поэлементные операции (+, -, *, /) работают напрямую на массивах NumPy.
- Для настоящего умножения матриц используйте
np.dot()или оператор@. - Срезы дают мощные способы извлечения подматриц или конкретных строк/столбцов.
- Всегда убеждайтесь, что матрицы имеют совместимые формы перед выполнением операций.
Python
- Словари в Python: создание, манипуляции и продвинутые техники
- Массивы в C++: объявление, инициализация и работа с указателями
- Функция print() в Python: практическое руководство с примерами
- Мастерство метода str.count() в Python: как подсчитывать символы и подстроки с примерами
- Мастерство строк форматирования format() в Python: понятные примеры
- Мастерство метода String.find() в Python: синтаксис, примеры и альтернативы
- Освоение лямбда-функций Python: практические примеры и лучшие практики
- Функция abs() в Python: вычисление абсолютных значений для чисел и комплексных чисел
- Функция round() в Python: подробное объяснение с практическими примерами
- Освоение функции range() в Python: от основ к продвинутым сценариям