Как создать матрицу в Python без NumPy: Пошаговое руководство

Что такое матрица: основные понятия и определения

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

Способы представления матриц в Python: списки списков

В Python одним из самых простых способов представления матриц является использование списков списков (list of lists). Каждый внутренний список представляет собой строку матрицы, а элементы списка — это элементы данной строки. Например, матрица 2×3 может быть представлена как [[1, 2, 3], [4, 5, 6]].

Зачем создавать матрицы без NumPy: альтернативные подходы

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

Создание матрицы с использованием списков (list)

Инициализация пустой матрицы заданного размера

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

def create_empty_matrix(rows: int, cols: int) -> list[list[int]]:
    """Creates an empty matrix (list of lists) with specified dimensions.

    Args:
        rows: The number of rows in the matrix.
        cols: The number of columns in the matrix.

    Returns:
        A matrix (list of lists) filled with zeros.
    """
    matrix: list[list[int]] = [[0 for _ in range(cols)] for _ in range(rows)]
    return matrix

matrix = create_empty_matrix(3, 4)
print(matrix)

Заполнение матрицы значениями вручную

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

def fill_matrix_manually(matrix: list[list[int]]) -> None:
    """Fills a matrix with values manually.

    Args:
        matrix: The matrix (list of lists) to fill.
    """
    matrix[0][0] = 1
    matrix[0][1] = 2
    matrix[1][0] = 3
    matrix[1][1] = 4

matrix = [[0, 0], [0, 0]]
fill_matrix_manually(matrix)
print(matrix)

Создание матрицы с использованием генераторов списков (list comprehensions)

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

def create_matrix_with_comprehension(rows: int, cols: int) -> list[list[int]]:
    """Creates a matrix using list comprehension.

    Args:
        rows: The number of rows in the matrix.
        cols: The number of columns in the matrix.

    Returns:
        A matrix (list of lists) with values.
    """
    matrix = [[(i * cols + j + 1)**2 for j in range(cols)] for i in range(rows)]
    return matrix

matrix = create_matrix_with_comprehension(2, 3)
print(matrix)

Примеры создания различных типов матриц (единичная, нулевая, диагональная)

  • Нулевая матрица: Все элементы равны нулю.
  • Единичная матрица: Диагональные элементы равны 1, остальные — 0.
  • Диагональная матрица: Все элементы вне главной диагонали равны 0.
def create_identity_matrix(n: int) -> list[list[int]]:
    """Creates an identity matrix.

    Args:
        n: The size of the matrix (n x n).

    Returns:
        An identity matrix (list of lists).
    """
    identity_matrix = [[1 if i == j else 0 for j in range(n)] for i in range(n)]
    return identity_matrix

identity_matrix = create_identity_matrix(3)
print(identity_matrix)
Реклама

Операции с матрицами без NumPy

Получение доступа к элементам матрицы (индексация)

Доступ к элементам матрицы осуществляется с помощью двойной индексации: matrix[row_index][col_index]. Индексы начинаются с 0.

Вывод матрицы на экран в читаемом формате

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

def print_matrix(matrix: list[list[int]]) -> None:
    """Prints a matrix in a readable format.

    Args:
        matrix: The matrix (list of lists) to print.
    """
    for row in matrix:
        print(' '.join(map(str, row)))

matrix = [[1, 2, 3], [4, 5, 6]]
print_matrix(matrix)

Реализация базовых операций: сложение и умножение матриц

Сложение матриц выполняется поэлементно. Умножение матриц требует более сложной логики:

def matrix_addition(matrix1: list[list[int]], matrix2: list[list[int]]) -> list[list[int]]:
    """Adds two matrices.

    Args:
        matrix1: The first matrix.
        matrix2: The second matrix.

    Returns:
        The sum of the matrices.
    """
    if len(matrix1) != len(matrix2) or len(matrix1[0]) != len(matrix2[0]):
        raise ValueError("Matrices must have the same dimensions.")

    result_matrix = [[matrix1[i][j] + matrix2[i][j] for j in range(len(matrix1[0]))] for i in range(len(matrix1))]
    return result_matrix

def matrix_multiplication(matrix1: list[list[int]], matrix2: list[list[int]]) -> list[list[int]]:
    """Multiplies two matrices.

    Args:
        matrix1: The first matrix.
        matrix2: The second matrix.

    Returns:
        The product of the matrices.
    """
    if len(matrix1[0]) != len(matrix2):  # Number of columns in matrix1 must equal number of rows in matrix2
        raise ValueError("Matrices dimensions are not suitable for multiplication.")

    rows1 = len(matrix1)
    cols1 = len(matrix1[0])
    rows2 = len(matrix2)
    cols2 = len(matrix2[0])

    result_matrix = [[sum(matrix1[i][k] * matrix2[k][j] for k in range(cols1)) for j in range(cols2)] for i in range(rows1)]
    return result_matrix

matrix1 = [[1, 2], [3, 4]]
matrix2 = [[5, 6], [7, 8]]

sum_matrix = matrix_addition(matrix1, matrix2)
print("Сумма матриц:", sum_matrix)

product_matrix = matrix_multiplication(matrix1, matrix2)
print("Произведение матриц:", product_matrix)

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

Транспонирование матрицы — это операция, при которой строки и столбцы меняются местами.

def transpose_matrix(matrix: list[list[int]]) -> list[list[int]]:
    """Transposes a matrix.

    Args:
        matrix: The matrix (list of lists) to transpose.

    Returns:
        The transposed matrix.
    """
    rows = len(matrix)
    cols = len(matrix[0])
    transposed_matrix = [[matrix[j][i] for j in range(rows)] for i in range(cols)]
    return transposed_matrix

matrix = [[1, 2, 3], [4, 5, 6]]
transposed_matrix = transpose_matrix(matrix)
print(transposed_matrix)

Преимущества и недостатки подхода без NumPy

Когда стоит использовать списки вместо NumPy

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

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

Ограничения и проблемы производительности

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

Альтернативные библиотеки для работы с матрицами

Если NumPy недоступен, можно рассмотреть другие библиотеки для работы с матрицами, например, scipy.sparse для работы с разреженными матрицами.

Заключение

Краткий обзор рассмотренных методов

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

Рекомендации по дальнейшему изучению матричных операций в Python

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


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