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].
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:
(2, 3)
[[120 128]
[135 142]
[150 160]]
(3, 2)
TrueBaris demi baris:
- Baris 3: array
(2, 3); dua bulan, tiga produk. - Baris 5 (
penjualan.T): baris pertama120, 135, 150kini menjadi kolom pertama. Bentuk berubah dari(2, 3)menjadi(3, 2). - Baris 7 (
np.array_equal):.Tadalah pintasan atribut, sedangkan.transpose()adalah method dengan kemampuan lengkap. Tanpa argumen, keduanya memberikan hasil yang sama, sehingga tercetakTrue.
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.
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:
True
999Penjelasan:
- Baris 4 (
hasil.base is penjualan):.basemenunjuk ke array pemilik buffer;Trueberartihasilhanyalah cara pandang lain ataspenjualan. - Baris 5-6 (uji mutasi): mengubah
hasil[0, 0]— yang secara logis adalahpenjualan[0, 0]yang ditransposkan — ikut mengubahpenjualan[0, 0]menjadi999.
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].
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:
(2, 3, 4)
(2, 4, 3)
23 23
(4, 3, 2)Mari kita bedah:
- Baris 3: data berbentuk
(2, 3, 4); misalnya 2 wilayah, 3 produk, 4 triwulan. - 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). - Baris 6 (uji pemetaan): aturan pemetaan adalah
hasil[i, j, k] == data[i, k, j], sehinggadata[1, 2, 3]danhasil[1, 3, 2]menunjuk elemen yang sama, yaitu23. Keduanya tercetak berdampingan. - Baris 7 (
data.T.shape):.Tmembalik seluruh urutan sumbu, setara dengantranspose(2, 1, 0), sehingga bentuknya(4, 3, 2).
Tabel berikut merangkum arti tuple (0, 2, 1):
| Sumbu baru | Diambil dari sumbu lama | Arti praktis |
|---|---|---|
| 0 | 0 | wilayah tetap paling depan |
| 1 | 2 | triwulan (lama ketiga) naik ke tengah |
| 2 | 1 | produk (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.