8-916-722-04-28ТелВКонтактеВКTelegramTgMAXMAX Пробный урокПробный урок

Создание, обход по строкам и столбцам, суммирование элементов, транспонирование матрицы

Понятие двумерного массива

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

Размер матрицы: число строк и столбцов

Число строк матрицы a в Python вычисляется как len(a) — это длина внешнего списка. Число столбцов определяется длиной одной из строк, например len(a[0]) — при условии, что все строки матрицы имеют одинаковую длину (такую матрицу называют прямоугольной, в отличие от «рваной», в которой строки могут содержать разное число элементов). На практике почти все задачи имеют дело именно с прямоугольными матрицами, и перед обработкой полезно явно вывести или проверить её размеры.

a = [

[1, 2, 3, 4],

[5, 6, 7, 8],

[9, 10, 11, 12]

]

rows = len(a)

cols = len(a[0])

print(f'Матрица размером {rows}x{cols}')

# Проверка, что матрица действительно прямоугольная

is_rectangular = all(len(row) == cols for row in a)

print('Прямоугольная:', is_rectangular)

Индексация элементов матрицы

Если матрица a имеет m строк и n столбцов, то к элементу, стоящему на пересечении строки i и столбца j, обращаются записью a[i][j], где i — номер строки (первый индекс), j — номер столбца (второй индекс). Нумерация строк и столбцов, как и в одномерном массиве, начинается с нуля.

0≤i≤m−1,0≤j≤n−1

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

Матрицу размером m×n можно задать явным перечислением строк либо сгенерировать с помощью вложенного генератора списков. Важно не создавать матрицу конструкцией [[0] * n] * m: в этом случае все m строк оказываются ссылками на один и тот же список, и изменение одного элемента затронет сразу все строки — это одна из самых коварных ошибок начинающих.

# Явное задание матрицы 3×4

a = [

[1, 2, 3, 4],

[5, 6, 7, 8],

[9, 10, 11, 12]

]

# ОШИБКА: все строки — один и тот же объект

wrong = [[0] * 4] * 3

wrong[0][0] = 99

print(wrong) # изменились ВСЕ строки!

# ПРАВИЛЬНО: вложенный генератор списков

m, n = 3, 4

correct = [[0] * n for _ in range(m)]

correct[0][0] = 99

print(correct) # изменилась только первая строка

# Заполнение случайными числами

import random

b = [[random.randint(1, 9) for _ in range(n)] for _ in range(m)]

print(b)

Ввод матрицы с клавиатуры

Матрицу обычно вводят построчно: сначала считывают число строк m и число столбцов n, а затем m раз считывают строку чисел через пробел.

m, n = map(int, input().split())

a = []

for i in range(m):

row = list(map(int, input().split()))

a.append(row)

print(a)

Обход матрицы по строкам и столбцам

Для перебора всех элементов матрицы используют два вложенных цикла: внешний цикл идёт по строкам (индекс i), внутренний — по столбцам (индекс j). Такой порядок обхода называют обходом «по строкам». Если нужно обойти матрицу «по столбцам», циклы можно поменять местами: внешний — по j, внутренний — по i.

a = [

[1, 2, 3],

[4, 5, 6],

[7, 8, 9]

]

m, n = len(a), len(a[0])

# Обход по строкам (сначала первая строка целиком, потом вторая…)

for i in range(m):

for j in range(n):

print(a[i][j], end=' ')

print()

# Обход по столбцам (сначала первый столбец целиком, потом второй…)

for j in range(n):

for i in range(m):

print(a[i][j], end=' ')

print()

Суммирование элементов матрицы

Сумма всех элементов матрицы вычисляется так же, как и для одномерного массива, — накоплением при полном переборе всех m·n элементов с помощью двух вложенных циклов.

S=ΣΣa[i][j],гдеi=0...m−1,j=0...n−1

a = [

[1, 2, 3],

[4, 5, 6],

[7, 8, 9]

]

total = 0

for i in range(len(a)):

for j in range(len(a[i])):

total += a[i][j]

print('Сумма всех элементов:', total)

# Сумма каждой строки

for i in range(len(a)):

print(f'Сумма строки {i}:', sum(a[i]))

# Сумма каждого столбца

n = len(a[0])

for j in range(n):

col_sum = 0

for i in range(len(a)):

col_sum += a[i][j]

print(f'Сумма столбца {j}:', col_sum)

Поиск максимального элемента и его координат

Поиск максимума в матрице устроен так же, как в одномерном массиве, только теперь для позиции элемента нужно хранить сразу два индекса — номер строки и номер столбца.

a = [

[1, 12, 3],

[4, 5, 6],

[7, 8, 9]

]

max_value = a[0][0]

max_i, max_j = 0, 0

for i in range(len(a)):

for j in range(len(a[i])):

if a[i][j] > max_value:

max_value = a[i][j]

max_i, max_j = i, j

print(f'Максимум {max_value} находится в строке {max_i}, столбце {max_j}')

Сумма элементов диагоналей

Для квадратной матрицы размером n×n отдельный интерес представляют элементы главной диагонали (индексы строки и столбца совпадают: a[i][i]) и элементы побочной диагонали (сумма индексов постоянна и равна n−1: a[i][n-1-i]).

главнаядиагональ:i=j;побочнаядиагональ:i+j=n−1

a = [

[1, 2, 3],

[4, 5, 6],

[7, 8, 9]

]

n = len(a)

main_diag_sum = 0

side_diag_sum = 0

for i in range(n):

main_diag_sum += a[i][i]

side_diag_sum += a[i][n — 1 — i]

print('Сумма главной диагонали:', main_diag_sum)

print('Сумма побочной диагонали:', side_diag_sum)

Применение матриц: игровое поле и таблица данных

Двумерные массивы естественно моделируют множество реальных объектов: игровое поле в задачах про крестики-нолики или морской бой (клетка (i, j) хранит своё состояние — пусто, крестик, нолик, корабль), шахматную доску, экран из пикселей (яркость каждого пикселя — элемент матрицы) или, например, таблицу оценок нескольких учеников по нескольким предметам, где строка соответствует ученику, а столбец — предмету. В последнем случае для получения среднего балла конкретного ученика достаточно найти среднее его строки, а для среднего балла по конкретному предмету — среднее соответствующего столбца, что напрямую использует уже рассмотренные приёмы обхода матрицы по строкам и по столбцам.

# Таблица оценок: строки — ученики, столбцы — предметы

grades = [

[5, 4, 5], # ученик 0

[3, 4, 4], # ученик 1

[5, 5, 5] # ученик 2

]

# Средний балл каждого ученика (среднее по строке)

for i, row in enumerate(grades):

print(f'Ученик {i}: средний балл {sum(row) / len(row):.2f}')

# Средний балл по каждому предмету (среднее по столбцу)

n = len(grades[0])

for j in range(n):

col = [grades[i][j] for i in range(len(grades))]

print(f'Предмет {j}: средний балл {sum(col) / len(col):.2f}')

Проверка на симметричность квадратной матрицы

Квадратная матрица называется симметричной, если она совпадает со своей транспонированной версией, то есть a[i][j] = a[j][i] для любых i и j. Симметричные матрицы часто встречаются в задачах, где хранится, например, таблица расстояний между городами или таблица взаимодействий: расстояние от города A до города B совпадает с расстоянием от B до A.

def is_symmetric(a):

n = len(a)

for i in range(n):

for j in range(n):

if a[i][j] != a[j][i]:

return False

return True

m1 = [[0, 3, 5], [3, 0, 7], [5, 7, 0]]

m2 = [[0, 3, 5], [4, 0, 7], [5, 7, 0]]

print(is_symmetric(m1)) # True

print(is_symmetric(m2)) # False

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

Транспонирование матрицы — это операция, при которой строки становятся столбцами, а столбцы — строками: элемент, стоявший на месте (i, j), переходит на место (j, i). Если исходная матрица имела размер m×n, то транспонированная будет иметь размер n×m.

aᵀ[j][i]=a[i][j]

a = [

[1, 2, 3],

[4, 5, 6]

]

m, n = len(a), len(a[0])

# Транспонирование вручную

b = [[0] * m for _ in range(n)]

for i in range(m):

for j in range(n):

b[j][i] = a[i][j]

for row in b:

print(row)

# Транспонирование с помощью zip

b2 = [list(row) for row in zip(*a)]

print(b2)

Типичные ошибки

Самая опасная ошибка при работе с матрицами — создание строк конструкцией [[0] * n] * m, при которой все строки ссылаются на один и тот же список в памяти. Также часто путают порядок индексов: a[i][j] означает «строка i, столбец j», а не наоборот, и при вводе матрицы важно не перепутать местами число строк m и число столбцов n. Ещё одна распространённая ошибка — использовать len(a) там, где нужна длина конкретной строки len(a[i]) (это критично для «рваных» матриц с разной длиной строк), и наоборот. Наконец, при переборе по столбцам легко перепутать внешний и внутренний циклы, что не приводит к ошибке выполнения, но меняет порядок обработки элементов.

Краткий словарь терминов

Матрица (двумерный массив) — таблица данных, элементы которой определяются двумя индексами — номером строки и номером столбца.

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

Главная диагональ — элементы матрицы, у которых номер строки равен номеру столбца (i = j).

Побочная диагональ — элементы матрицы, у которых сумма номера строки и номера столбца постоянна и равна n−1.

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

Вложенный цикл — цикл внутри другого цикла; используется для обхода всех элементов двумерного массива.

Заключение

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

Запишитесь на бесплатный урок

Определим уровень, покажем формат занятий и составим план подготовки.