Data tabular sering kali perlu dibaca dari arah yang berbeda: kadang per baris, kadang per kolom. Dalam rumus matematika, orientasi itu bahkan menjadi bagian dari notasi — matriks data berordo (m, n) dengan m sampel dan n fitur lazim harus di-transpose sebelum bisa dikalikan dengan vektor parameter. Transpose menjawab kebutuhan itu dengan menukar peran baris dan kolom: elemen pada posisi (i, j) pindah ke posisi (j, i), sehingga matriks berordo (m, n) berubah menjadi (n, m).
Di NumPy, transpose diakses lewat atribut .T atau fungsi np.transpose(). Bab ini membahas transpose dalam konteks matriks: sifat penting (A @ B).T == B.T @ A.T, konversi vektor baris dan vektor kolom, serta peran transpose dalam penurunan rumus seperti normal equation. Mekanisme view dan parameter axes yang lebih umum telah dibahas pada Chapter transpose.
Transpose Menukar Baris dan Kolom #
Contoh berikut memakai matriks penjualan 2x3 — dua cabang, tiga produk. Perhatikan bagaimana A.T membaca ulang posisi elemen tanpa menyalin data:
import numpy as np
A = np.array([[1, 2, 3],
[4, 5, 6]])
print(A.shape)
print(A.T)
print(A.T.shape)
print(np.array_equal(A.T.T, A))Output yang Dihasilkan:
(2, 3)
[[1 4]
[2 5]
[3 6]]
(3, 2)
TrueBedah baris demi baris:
- Baris 3-4 (
A = np.array(...)):Aadalah matriks 2x3; baris pertama[1, 2, 3], baris kedua[4, 5, 6]. - Baris 5 (
print(A.shape)): bentuk asli(2, 3)— dua baris, tiga kolom. - Baris 6 (
print(A.T)): setiap elemenA[i, j]kini terbaca pada posisi(j, i). Kolom[1, 4]milikAmenjadi baris pertama hasil transpose. - Baris 7 (
A.T.shape): bentuk hasil(3, 2)— baris dan kolom bertukar tempat. - Baris 8 (
np.array_equal(A.T.T, A)): transpose diterapkan dua kali mengembalikan susunan asal;array_equalmembandingkan nilai kedua array dan mengembalikanTrue.
Sifat (A @ B).T = B.T @ A.T #
Perkalian matriks tidak komutatif (Chapter Matrix Multiplication), tetapi transpose memutar balik urutan perkalian: transpose dari A @ B sama dengan B.T @ A.T. Sifat ini sering dipakai untuk menyusun ulang perhitungan tanpa mengubah hasil.
import numpy as np
A = np.array([[1, 2],
[3, 4]])
B = np.array([[5, 6],
[7, 8]])
kiri = (A @ B).T
kanan = B.T @ A.T
print(kiri)
print(kanan)
print(np.array_equal(kiri, kanan))Output yang Dihasilkan:
[[19 43]
[22 50]]
[[19 43]
[22 50]]
TrueBedah baris demi baris:
- Baris 7 (
kiri = (A @ B).T): interpreter mengalikanA @ Bterlebih dahulu — hasil antara[[19, 22], [43, 50]]— lalu mentranspose hasil antara itu. - Baris 8 (
kanan = B.T @ A.T): urutannya dibalik; kedua operand ditranspose dahulu, baru dikalikan dengan urutan yang diputar. - Baris 11 (
np.array_equal(kiri, kanan)): kedua jalur menghasilkan matriks bernilai sama;Truemembuktikan sifat tersebut pada pasangan matriks ini.
Alasannya dapat dilacak lewat indeks. Elemen (i, j) milik (A @ B).T adalah elemen (j, i) milik A @ B, yaitu A[j,0]·B[0,i] + A[j,1]·B[1,i] + .... Jumlah yang sama diperoleh dari baris ke-i milik B.T dikali kolom ke-j milik A.T — persis definisi (B.T @ A.T)[i, j].
Vektor Baris dan Vektor Kolom #
Dalam buku teks aljabar linear, vektor lazim ditulis sebagai kolom berordo (n, 1). Array NumPy satu dimensi berbentuk (n,) — hanya satu sumbu — sehingga transpose tidak punya pasangan sumbu untuk ditukar:
import numpy as np
v = np.array([3.0, 4.0])
print(v.shape, v.T.shape)
kolom = v.reshape(-1, 1)
print(kolom)
print(kolom.shape)
print(v[:, np.newaxis].shape)Output yang Dihasilkan:
(2,) (2,)
[[3.]
[4.]]
(2, 1)
(2, 1)Bedah baris demi baris:
- Baris 4 (
v.shape, v.T.shape): keduanya(2,). Transpose pada array 1-D tidak mengubah bentuk — jebakan bagi pembaca yang mengharapkan vektor kolom dari.T. - Baris 5 (
kolom = v.reshape(-1, 1)):-1berarti “hitung sendiri jumlah barisnya”, sehinggavdisusun menjadi satu kolom berisi dua baris. - Baris 8 (
v[:, np.newaxis]): idiom setara —np.newaxismenyisipkan sumbu baru pada posisi tersebut, menghasilkan bentuk(2, 1)tanpa menyalin data.
Tabel berikut merangkum pilihan konversinya:
| Ekspresi | Bentuk hasil | Peran |
|---|---|---|
v | (n,) | array 1-D |
v.T | (n,) | no-op untuk array 1-D |
v.reshape(-1, 1) | (n, 1) | vektor kolom |
v[np.newaxis, :] | (1, n) | vektor baris |
Transpose dalam Penurunan Rumus: Normal Equation #
Transpose juga muncul secara alami saat menurunkan rumus. Regresi linear mencari beta sehingga A @ beta mendekati b. Dengan mengalikan kedua ruas dari kiri dengan A.T, kita peroleh normal equation: (A.T @ A) beta = A.T @ b. Keuntungannya: A.T @ A selalu berordo persegi — dua kali dua untuk dua parameter — berapa pun jumlah datanya.
import numpy as np
jam_belajar = np.array([1.0, 2.0, 3.0, 4.0])
A = np.column_stack([np.ones(4), jam_belajar])
b = np.array([55.0, 62.0, 71.0, 78.0])
beta = np.linalg.solve(A.T @ A, A.T @ b)
print(A.T.shape)
print(A.T @ A)
print(beta)Output yang Dihasilkan:
(2, 4)
[[ 4. 10.]
[10. 30.]]
[47. 7.8]Bedah baris demi baris:
- Baris 4 (
A = np.column_stack(...)):Aberbentuk(4, 2)— kolom pertama berisi angka 1 untuk intersep, kolom kedua jam belajar. - Baris 6 (
np.linalg.solve(...)):A.T @ Aberordo(2, 2)sehingga sistem dapat diselesaikan langsung;A.T @ bmenyiapkan ruas kanan. - Baris 8 (
print(A.T @ A)): matriksnya simetris — nilai10.0muncul pada dua posisi yang saling mencerminkan, konsekuensi dari bentukA.T @ A. - Baris 9 (
print(beta)): hasil[47. 7.8]— nilai awal 47 dan tambahan 7.8 poin per jam belajar.
Pembahasan penuh regresi ini tersedia pada Chapter Least Squares; di sini yang penting adalah peran A.T: matriks data berordo (4, 2) berubah menjadi sistem kecil berordo persegi yang bisa diselesaikan.