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:

python
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:

text
(2, 3)
[[1 4]
 [2 5]
 [3 6]]
(3, 2)
True

Bedah baris demi baris:

  1. Baris 3-4 (A = np.array(...)): A adalah matriks 2x3; baris pertama [1, 2, 3], baris kedua [4, 5, 6].
  2. Baris 5 (print(A.shape)): bentuk asli (2, 3) — dua baris, tiga kolom.
  3. Baris 6 (print(A.T)): setiap elemen A[i, j] kini terbaca pada posisi (j, i). Kolom [1, 4] milik A menjadi baris pertama hasil transpose.
  4. Baris 7 (A.T.shape): bentuk hasil (3, 2) — baris dan kolom bertukar tempat.
  5. Baris 8 (np.array_equal(A.T.T, A)): transpose diterapkan dua kali mengembalikan susunan asal; array_equal membandingkan nilai kedua array dan mengembalikan True.

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.

python
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:

text
[[19 43]
 [22 50]]
[[19 43]
 [22 50]]
True

Bedah baris demi baris:

  1. Baris 7 (kiri = (A @ B).T): interpreter mengalikan A @ B terlebih dahulu — hasil antara [[19, 22], [43, 50]] — lalu mentranspose hasil antara itu.
  2. Baris 8 (kanan = B.T @ A.T): urutannya dibalik; kedua operand ditranspose dahulu, baru dikalikan dengan urutan yang diputar.
  3. Baris 11 (np.array_equal(kiri, kanan)): kedua jalur menghasilkan matriks bernilai sama; True membuktikan 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:

python
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:

text
(2,) (2,)
[[3.]
 [4.]]
(2, 1)
(2, 1)

Bedah baris demi baris:

  1. 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.
  2. Baris 5 (kolom = v.reshape(-1, 1)): -1 berarti “hitung sendiri jumlah barisnya”, sehingga v disusun menjadi satu kolom berisi dua baris.
  3. Baris 8 (v[:, np.newaxis]): idiom setara — np.newaxis menyisipkan sumbu baru pada posisi tersebut, menghasilkan bentuk (2, 1) tanpa menyalin data.

Tabel berikut merangkum pilihan konversinya:

EkspresiBentuk hasilPeran
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.

python
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:

text
(2, 4)
[[ 4. 10.]
 [10. 30.]]
[47.   7.8]

Bedah baris demi baris:

  1. Baris 4 (A = np.column_stack(...)): A berbentuk (4, 2) — kolom pertama berisi angka 1 untuk intersep, kolom kedua jam belajar.
  2. Baris 6 (np.linalg.solve(...)): A.T @ A berordo (2, 2) sehingga sistem dapat diselesaikan langsung; A.T @ b menyiapkan ruas kanan.
  3. Baris 8 (print(A.T @ A)): matriksnya simetris — nilai 10.0 muncul pada dua posisi yang saling mencerminkan, konsekuensi dari bentuk A.T @ A.
  4. 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.