Setiap matriks persegi memiliki garis istimewa: diagonal utama, kumpulan elemen yang nomor barisnya sama dengan nomor kolomnya. Elemen diagonal sering menyimpan informasi kunci — varians tiap variabel pada matriks kovarians, bobot tiap item, atau kiriman yang tidak berpindah tempat — dan penjumlahannya, yang disebut trace, muncul di banyak sifat aljabar linear. NumPy menyediakan tiga alat untuk pekerjaan ini: np.diagonal, np.diag, dan np.trace.

Mengambil Diagonal Matriks #

Kedua fungsi berikut mengambil diagonal utama sebagai array 1-D; parameter k menggeser posisi diagonal yang diambil:

python
import numpy as np

A = np.array([[4, 1, 2],
              [0, 7, 3],
              [5, 0, 6]])
print(A.diagonal())
print(np.diag(A))
print(np.diag(A, k=1))
print(np.diag(A, k=-1))

Output yang Dihasilkan:

text
[4 7 6]
[4 7 6]
[1 3]
[0 0]

Bedah baris demi baris:

  1. Baris 3-5 (A = np.array(...)): A adalah matriks 3x3.
  2. Baris 6 (A.diagonal()): mengambil A[0,0], A[1,1], A[2,2] → [4 7 6].
  3. Baris 7 (np.diag(A)): hasilnya sama; perbedaannya, np.diag punya dua peran — mengambil diagonal dari matriks 2-D dan membangun matriks dari array 1-D (bagian berikutnya).
  4. Baris 8 (np.diag(A, k=1)): k=1 menggeser satu langkah ke atas → A[0,1] dan A[1,2] → [1 3].
  5. Baris 9 (np.diag(A, k=-1)): k=-1 menggeser satu langkah ke bawah → A[1,0] dan A[2,1] → [0 0].

Perbedaan memori antara keduanya perlu diperhatikan:

EkspresiInputHasilSifat memori
A.diagonal()matriks 2-Ddiagonal utama, 1-Dview read-only
np.diag(A, k)matriks 2-Ddiagonal offset k, 1-Dcopy
np.diag(d, k)array 1-Dmatriks diagonal baruarray baru

Membangun Matriks Diagonal dari Vektor #

Bila argumen np.diag adalah array 1-D, arah kerjanya berbalik: hasilnya matriks persegi yang menaruh vektor pada diagonalnya dan nol di seluruh posisi lain. Pola ini lazim dipakai untuk operasi berbobot:

python
import numpy as np

bobot = np.array([2, 3, 4])
W = np.diag(bobot)
print(W)
print(W.shape)

Output yang Dihasilkan:

text
[[2 0 0]
 [0 3 0]
 [0 0 4]]
(3, 3)

Bedah baris demi baris:

  1. Baris 4 (W = np.diag(bobot)): W[i, i] diisi bobot[i]; seluruh posisi lain diisi 0.
  2. Baris 6 (W.shape): matriksnya persegi (3, 3) — panjang vektor menentukan ordonya.

Parameter k juga dihormati pada mode membangun: np.diag(bobot, k=1) menghasilkan matriks 4x4 dengan [2 3 4] pada diagonal pertama di atas utama. Kebalikannya, matriks identitas dapat dibangun dengan np.diag(np.ones(3)) — meskipun np.eye(3) adalah cara yang lebih ringkas.

Trace: Menjumlahkan Elemen Diagonal #

np.trace menjumlahkan seluruh elemen diagonal. Interpretasinya bergantung pada makna matriks: bila A menyatakan jumlah kiriman antar gudang — A[i, j] adalah kiriman dari gudang i ke gudang j — maka elemen diagonal adalah kiriman yang berangkat dan tiba di gudang yang sama, dan trace menjadi total kontribusi diri: volume yang tidak berpindah tempat.

python
import numpy as np

A = np.array([[4, 1, 2],
              [0, 7, 3],
              [5, 0, 6]])
print(np.trace(A))
print(np.trace(A, offset=1))
print(np.trace(A, offset=-1))

Output yang Dihasilkan:

text
17
4
0

Bedah baris demi baris:

  1. Baris 6 (np.trace(A)): 4 + 7 + 6 = 17 — jumlah ketiga elemen diagonal utama.
  2. Baris 7 (offset=1): menjumlahkan diagonal yang digeser satu ke atas: 1 + 3 = 4.
  3. Baris 8 (offset=-1): menjumlahkan diagonal di bawah utama: 0 + 0 = 0.

Hasil np.trace berupa scalar — np.int64 untuk matriks integer, np.float64 untuk matriks float — bukan array. Parameter offset berperan seperti k pada np.diag, sehingga keduanya selalu bisa dipadukan.

Sifat tr(AB) = tr(BA) #

Perkalian matriks tidak komutatif, tetapi trace-nya komutatif: tr(A @ B) selalu sama dengan tr(B @ A). Sifat ini menjadi alat verifikasi cepat dan sering dipakai untuk menyederhanakan rumus aljabar linear:

python
import numpy as np

A = np.array([[1, 2],
              [3, 4]])
B = np.array([[5, 6],
              [7, 8]])
print(np.trace(A @ B))
print(np.trace(B @ A))
print(np.array_equal(np.trace(A @ B), np.trace(B @ A)))

Output yang Dihasilkan:

text
69
69
True

Bedah baris demi baris:

  1. Baris 7 (np.trace(A @ B)): trace dari A @ B bernilai 69.
  2. Baris 8 (np.trace(B @ A)): matriks produknya berbeda (A @ B tidak sama dengan B @ A), tetapi trace-nya kembali 69.
  3. Baris 9 (np.array_equal(...)): array_equal menerima scalar, sehingga perbandingan identitas trace cukup ditulis satu baris; hasilnya True.

Alasannya: tr(A @ B) menjumlahkan A[i, k] · B[k, i] atas seluruh pasangan indeks i, k. Dengan menukar nama indeks — i berganti peran menjadi k dan sebaliknya — jumlah yang sama terbaca sebagai tr(B @ A). Urutan penjumlahan berubah, nilainya tidak.