Лекция · 4.5

Python: Екі өлшемді массив

Сынып журналын елестет: әр оқушының әр пән бойынша бағасы бар — бұл бір тізім емес, КЕСТЕ. Шахмат тақтасы, Excel кестесі, көбейту кестесі — бәрі де жол мен бағаннан тұрады. Мұндай деректі бір өлшемді тізіммен сақтау қолайсыз. Осы сабақта тізімдер тізімін — екі өлшемді массивті (матрицаны) — құруды және өңдеуді үйренеміз. Бұл тақырып 8-сыныпта өтілмеген, бірақ ҰБТ-да толық тарау ретінде кездеседі.

Матрица деген не
Анықтама
Матрица (екі өлшемді массив) — m жол мен n бағаннан тұратын тіктөртбұрышты кесте. Программалауда әрбір элемент жол мен баған нөмірінің қиылысында анықталады.

Python-да классикалық (басқа тілдердегідей қатаң) көпөлшемді массив жоқ. Оның орнына тізімдер тізімі (list of lists) қолданылады — тізімнің әр элементінің өзі тізім болады.

arr = [[11, 22, 33], [44, 55, 66]]

Бұл — 2 жолдан, 3 бағаннан тұратын массив. arr[0] — бірінші жол ([11, 22, 33]), arr[1][2] — екінші жол, үшінші баған қиылысы (66).

🗺️
Аналогия: матрица — шахмат тақтасы. Әр дананың орнын анықтау үшін бір координата (тек «e») жеткіліксіз, екеуі керек («e4»). Дәл солай, екі өлшемді массив элементіне жету үшін екі индекс — жол және баған — керек.
Жариялау және толтыру

N×N өлшемді, барлық элементі нөлге тең массив жасаудың ыңғайлы тәсілі — кіріктірілген тізім генераторы:

from random import randint
N = int(input())
a = [[0 for j in range(N)] for i in range(N)]
for i in range(0, N):
    for j in range(0, N):
        a[i][j] = randint(1, 9)
⚠️
Ескерту: a = [[0]*N]*N деп жазуға болмайды! Бұл N рет БІР ҒАНА тізімге сілтеме жасайды — бір жолды өзгертсең, барлық жол өзгереді. Дұрысы — жоғарыдағы генератор тәсілі, ол әр жолға жеке тізім жасайды.
Екі тәсілмен аралау
# 1-тәсіл: индекс бойынша
for i in range(len(arr)):
    for j in range(len(arr[i])):
        print(arr[i][j], end=' ')
    print()

# 2-тәсіл: мән бойынша
for row in arr:
    for elem in row:
        print(elem, end=' ')
    print()

Екі тәсіл де матрицаны толық аралайды және бірдей нәтиже береді. Индекс бойынша тәсіл — диагональ, орын ауыстыру секілді индекске тікелей тәуелді есептерге қолайлы; мән бойынша тәсіл — тек элементтерді оқу/қосынды табу секілді жағдайларда қысқарақ.

Бас және жанама диагональ
Анықтама
Бас диагональ: i == j шартын қанағаттандыратын элементтер (солдан оңға төмен қарай). Жанама диагональ: i + j == N-1 шартын қанағаттандыратын элементтер (оңнан солға төмен қарай), N×N массивте, 0-индекстен санағанда.
j=0j=1j=2j=3
i=0··
i=1··
i=2··
i=3··

● — бас диагональ (i==j), ○ — жанама диагональ (i+j==N-1, мұнда N=4 болғандықтан i+j==3).

S = 0
for i in range(N):
    for j in range(N):
        if i == j:
            S += a[i][j]   # бас диагональ қосындысы
🎯 ҰБТ байланысы
Екі өлшемді массив — Python блогының толық тарауы.
1
arr[i][j] жазылымында алдымен жол, содан кейін баған индексі келеді.
2
[[0]*N]*N қатесі — барлық жол бір ғана тізімге сілтейді.
3
Бас диагональ i==j, жанама диагональ i+j==N-1 (0-индекс үшін).
4
len(a) — жол саны, len(a[i]) — i-ші жолдың баған саны (әр жол әртүрлі болуы мүмкін).
Сабақ қорытындысы
  • Екі өлшемді массив — тізімдер тізімі: arr = [[11,22],[33,44]].
  • Элементке қатынау: arr[i][j] (i — жол, j — баған).
  • Толтыру: [[0 for j in range(N)] for i in range(N)] — әр жолға жеке тізім.
  • Аралау: индекс бойынша (for i, for j) немесе мән бойынша (for row, for elem).
  • Бас диагональ: i==j; жанама диагональ: i+j==N-1.