Laporan penjualan bisa dibaca dua arah: per produk sepanjang waktu, atau per waktu sepanjang produk. Kedua pandangan memuat data yang sama; yang berubah hanyalah posisi sumbu. Di sinilah transpose berperan: menukar urutan sumbu array tanpa menyalin satu elemen pun.

Transpose juga kebutuhan wajib di aljabar linear, misalnya saat menghitung A.T @ A atau menyelaraskan vektor baris dengan vektor kolom. Bab ini membahas atribut .T, method .transpose(), sifat view-nya, serta transposisi array tiga dimensi dengan tuple axes.

Atribut .T dan Method transpose() #

Pada array 2-D, transpose menukar baris dengan kolom. Elemen di a[i, j] berpindah ke posisi [j, i].

python
import numpy as np

penjualan = np.array([[120, 135, 150], [128, 142, 160]])
print(penjualan.shape)
print(penjualan.T)
print(penjualan.T.shape)
print(np.array_equal(penjualan.T, penjualan.transpose()))

Output yang Dihasilkan:

text
(2, 3)
[[120 128]
 [135 142]
 [150 160]]
(3, 2)
True

Baris demi baris:

  1. Baris 3: array (2, 3); dua bulan, tiga produk.
  2. Baris 5 (penjualan.T): baris pertama 120, 135, 150 kini menjadi kolom pertama. Bentuk berubah dari (2, 3) menjadi (3, 2).
  3. Baris 7 (np.array_equal): .T adalah pintasan atribut, sedangkan .transpose() adalah method dengan kemampuan lengkap. Tanpa argumen, keduanya memberikan hasil yang sama, sehingga tercetak True.

Perhatikan bahwa tidak ada angka yang berubah nilainya; hanya posisinya yang dipetakan ulang. Pada array 1-D, .T menghasilkan array dengan bentuk yang sama karena tidak ada baris dan kolom untuk ditukar.

Cara cepat membaca hasil transpose 2-D: baris asal menjadi kolom, dan kolom asal menjadi baris. Baris pertama asal 120, 135, 150 kini dibaca dari atas ke bawah sebagai kolom pertama.

transpose adalah View #

Hasil transpose berbagi memori dengan array asal; NumPy hanya mengubah urutan langkah (stride) saat membaca buffer.

python
import numpy as np

penjualan = np.array([[120, 135, 150], [128, 142, 160]])
hasil = penjualan.T
print(hasil.base is penjualan)
hasil[0, 0] = 999
print(penjualan[0, 0])

Output yang Dihasilkan:

text
True
999

Penjelasan:

  1. Baris 4 (hasil.base is penjualan): .base menunjuk ke array pemilik buffer; True berarti hasil hanyalah cara pandang lain atas penjualan.
  2. Baris 5-6 (uji mutasi): mengubah hasil[0, 0] — yang secara logis adalah penjualan[0, 0] yang ditransposkan — ikut mengubah penjualan[0, 0] menjadi 999.

Transposisi pada Array 3-D #

Untuk array tiga dimensi ke atas, .T tanpa argumen membalik urutan seluruh sumbu. Bila kita ingin pengaturan yang lebih halus, .transpose() menerima tuple axes: sumbu baru ke-j mengambil sumbu lama ke-axes[j].

python
import numpy as np

data = np.arange(24).reshape(2, 3, 4)
print(data.shape)
hasil = data.transpose(0, 2, 1)
print(hasil.shape)
print(data[1, 2, 3], hasil[1, 3, 2])
print(data.T.shape)

Output yang Dihasilkan:

text
(2, 3, 4)
(2, 4, 3)
23 23
(4, 3, 2)

Mari kita bedah:

  1. Baris 3: data berbentuk (2, 3, 4); misalnya 2 wilayah, 3 produk, 4 triwulan.
  2. Baris 5 (transpose(0, 2, 1)): tuple (0, 2, 1) berarti sumbu baru pertama adalah sumbu lama pertama, sumbu baru kedua adalah sumbu lama ketiga, dan sumbu baru ketiga adalah sumbu lama kedua. Bentuk berubah menjadi (2, 4, 3).
  3. Baris 6 (uji pemetaan): aturan pemetaan adalah hasil[i, j, k] == data[i, k, j], sehingga data[1, 2, 3] dan hasil[1, 3, 2] menunjuk elemen yang sama, yaitu 23. Keduanya tercetak berdampingan.
  4. Baris 7 (data.T.shape): .T membalik seluruh urutan sumbu, setara dengan transpose(2, 1, 0), sehingga bentuknya (4, 3, 2).

Tabel berikut merangkum arti tuple (0, 2, 1):

Sumbu baruDiambil dari sumbu lamaArti praktis
00wilayah tetap paling depan
12triwulan (lama ketiga) naik ke tengah
21produk (lama kedua) turun ke belakang

Dengan begitu, bentuk hasil (2, 4, 3) terbaca sebagai wilayah, triwulan, produk. Ketika pembacaan hasil[i, j, k] dijalankan, NumPy menerjemahkannya menjadi data[i, k, j]; itulah sebabnya elemen yang sama tercetak dua kali pada uji pemetaan di atas, meskipun urutan indeksnya berbeda.