Поняття двовимірного масиву
Одновимірний масив можна уявити як таблицю, що містить один рядок або стовпець даних. Однак нам часто доводиться працювати з таблицями, у яких кілька рядків і кілька стовпців. Для опрацювання даних таких таблиць зручно використовувати двовимірний масив. Кожний елемент такого масиву визначається двома індексами.
Двовимірний масив — таблиця з \(n\) рядків, m стовпців.
Масив називається двовимірним, якщо для задання місцеположення елемента в масиві необхідно вказати значення двох індексів.
Приклад:
Як двовимірний масив можна уявити стільці в залі кінотеатру, де кожний стілець визначається двома індексами — номером ряду і номером стільця в ряду. У вигляді двовимірного масиву легко подати поле шахівниці або популярної комп’ютерної гри Сапер. Матриця екрана вашого монітора також є двовимірним масивом пікселів.
104.PNG
Двовимірні списки —списки списків
У мові Python для  опрацювання двовимірних масивів використовуються двовимірні списки, тобто списки, кожен елемент яких є списком значень.
Приклад:
Збережемо дані таблиці, поданої на рис.1, у змінній \(а\).
 
94.PNG
Рис.1

a = [[1, 2, 3, 12], [23, 45, 13, 4], [8, 6, 7, 11]]
Кожний елемент двовимірного списку а також є списком, що містить дані з одного рядка таблиці. Довжина списку len(a) = 3.
 
Звернутися до елемента двовимірного списку (рядка таблиці) можна за його індексом:
a[0] = [1, 2, 3, 12].
 
Для перебору рядків списку використовується цикл for.
Можна перебрати індекси вкладених списків — елементів двовимірного списку . 
 for i in range (len(a)):
        print(a[i])
 Можна перебрати всі наявні у двовимірному  списку елементи — рядки таблиці.
 for row in a:
        print(row)
 При використанні обох варіантів циклу в консоль буде виведено наведене на рис. 2.
 
93.PNG
Рис.2

Положення елемента в таблиці визначається 2 індексами — номером рядка і номером стовпця, отже для доступу до елемента у вкладеному списку  слід указати два індекси (рис. 3).
 
95.PNG
Рис.3
Елемент, розташований на перетині і-го рядка і j-го стовпця масиву a, позначають a[і][j].
Зверни увагу!
У двовимірних масивах перший індекс завжди вказує на номер рядка, а другий — на номер стовпця таблиці.
Головну діагональ масиву утворюють елементи, для яких i == j.
 Послідовно отримати доступ до кожного елемента двовимірного масиву можна за допомогою вкладених циклів: зовнішній цикл перебирає вкладені списки (рядки таблиці), внутрішній цикл перебирає елементи рядка.
Приклад:
Виведення значень списку а в консоль порядково:
 
96.PNG

Згадаємо, що параметр end=' ' метода print() потрібен, щоб після виведення курсор залишився в тому самому рядку. Оператор print() з порожнім списком виведення переводить курсор на наступний рядок.

Створення двовимірного списку для зберігання масиву з n рядків та m стовпців
Створення порожнього списку а з 3 рядків: 
a = [[], [], []]
Нехай потрібно створити список для збереження даних прямокутної таблиці, у якій n рядків і m стовпців, і заповнити його нулями.

Це можна зробити в такий спосіб (рис. 4):
n, m = 3, 4
a = [] # Створюємо порожній список
for i in range(n): # Додаємо n елементів
          a.append([0]*m) # Кожен елемент — список з m нулів
 
97.PNG
Рис.5
 
Двовимірний масив можна створити з використанням генератора. Список [0]*m заново генерується для заповнення чергового елемента списку а.

a = [list(input().split()) for i in range(n)]
Уведення  значень двовимірного масиву з клавіатури
Щоб заповнити двовимірний список цілими значеннями елементів двовимірного масиву з n рядків і m стовпців, уводячи значення елементів з клавіатури, слід n разів виконати дії:
1) увести рядок s, що містить m чисел, відокремлених пробілами, і розбити рядок s функцією split() на підрядки;
2) функцією map() кожний підрядок рядка s перетворити на числовий тип;
3) функцією list() отриману послідовність перетворити у список row
4) список row додати до списку а.
n = int(input()) # Кількість рядків масиву
a = [] # Створюється порожній список
for i in range(n):
    s= input().split()
    row=list(map(int, s))
    a.append(row)
Заповнення двовимірного масиву випадковими числами
Заповнимо двовимірний список випадковими значеннями елементів двовимірного масиву з n рядків і m стовпців:
from random import randint
n, m=3, 4
a = [[] for i in range(n)]
for i in range(n):
            for j in range(m):
                         a[i] .append(randint(1,10)) # Додавання чергового елемента до і-го рядка
print (a)
Результат виведення списку а в консоль може бути таким:
[[7, 4, 4, 2], [10, 9, 1, 10], [6, 7, 2, 2]]
Надання значень елементам двовимірного масиву за формулою
Задання значень елементів двовимірного масиву за певною формулою має місце у випадках, коли значення елемента залежить від його індексів. 
Приклад:
Заповнимо вкладений список а елементами таблиці Піфагора:
 
99.PNG
98.PNG
 
Нехай кожний елемент масиву 5х5 дорівнює більшому з його індексів:
 
100.PNG 101.PNG
 
Заповнимо двовимірний масив 5 × 5 у такий спосіб:
  • елементам головної діагоналі присвоїти значення 1,
  • елементам, що розташовані вище головної діагоналі, — значення 2,
  • елементам, що розташовані нижче головної діагоналі, — значення 0.
102.PNG 103.PNG
Джерела:
Інформатика : підруч. для 9 кл. закл. загал. серед. освіти / [О. О. Бондаренко, В. В. Ластовецький, О. П. Пилипчук, Є. А. Шестопалов]. — Харків : Вид-во «Ранок», 2022.