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:
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:
[4 7 6]
[4 7 6]
[1 3]
[0 0]Bedah baris demi baris:
- Baris 3-5 (
A = np.array(...)):Aadalah matriks 3x3. - Baris 6 (
A.diagonal()): mengambilA[0,0],A[1,1],A[2,2]→[4 7 6]. - Baris 7 (
np.diag(A)): hasilnya sama; perbedaannya,np.diagpunya dua peran — mengambil diagonal dari matriks 2-D dan membangun matriks dari array 1-D (bagian berikutnya). - Baris 8 (
np.diag(A, k=1)):k=1menggeser satu langkah ke atas →A[0,1]danA[1,2]→[1 3]. - Baris 9 (
np.diag(A, k=-1)):k=-1menggeser satu langkah ke bawah →A[1,0]danA[2,1]→[0 0].
Perbedaan memori antara keduanya perlu diperhatikan:
| Ekspresi | Input | Hasil | Sifat memori |
|---|---|---|---|
A.diagonal() | matriks 2-D | diagonal utama, 1-D | view read-only |
np.diag(A, k) | matriks 2-D | diagonal offset k, 1-D | copy |
np.diag(d, k) | array 1-D | matriks diagonal baru | array 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:
import numpy as np
bobot = np.array([2, 3, 4])
W = np.diag(bobot)
print(W)
print(W.shape)Output yang Dihasilkan:
[[2 0 0]
[0 3 0]
[0 0 4]]
(3, 3)Bedah baris demi baris:
- Baris 4 (
W = np.diag(bobot)):W[i, i]diisibobot[i]; seluruh posisi lain diisi 0. - 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.
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:
17
4
0Bedah baris demi baris:
- Baris 6 (
np.trace(A)):4 + 7 + 6 = 17— jumlah ketiga elemen diagonal utama. - Baris 7 (
offset=1): menjumlahkan diagonal yang digeser satu ke atas:1 + 3 = 4. - 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:
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:
69
69
TrueBedah baris demi baris:
- Baris 7 (
np.trace(A @ B)): trace dariA @ Bbernilai 69. - Baris 8 (
np.trace(B @ A)): matriks produknya berbeda (A @ Btidak sama denganB @ A), tetapi trace-nya kembali 69. - Baris 9 (
np.array_equal(...)):array_equalmenerima scalar, sehingga perbandingan identitas trace cukup ditulis satu baris; hasilnyaTrue.
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.