Transpose menukar kedudukan sumbu dalam sebuah array tanpa mengubah nilai elemennya, sehingga baris menjadi kolom dan sebaliknya. Topik ini membahas atribut .T untuk array dua dimensi, metode transpose() untuk urutan sumbu bebas, np.swapaxes untuk menukar dua sumbu tertentu, serta sifat view pada seluruh hasil tersebut. Hubungan transpose dengan aturan broadcasting juga dijelaskan karena keduanya sering digunakan berdampingan.
Transpose dua dimensi dengan .T#
Pada array dua dimensi, transpose adalah pencerminan terhadap diagonal utama, yaitu elemen pada baris i dan kolom j pindah ke baris j dan kolom i. Atribut .T menyediakan operasi itu dengan cara paling ringkas. Bentuk array hasil adalah kebalikan urutan bentuk asalnya.
import numpy as np
a = np.arange(6).reshape(2, 3)
print(a)
print(a.T)[[0 1 2]
[3 4 5]]
[[0 3]
[1 4]
[2 5]]Array asal berbentuk (2, 3) dengan baris pertama 0, 1, 2 dan baris kedua 3, 4, 5, sedangkan hasilnya berbentuk (3, 2) dengan baris pertama 0, 3. Angka 1 yang semula berada pada baris 0 dan kolom 1 kini berada pada baris 1 dan kolom 0, sesuai definisi pencerminan tersebut. Atribut .T dapat dipanggil pada array dengan dimensi berapa pun tanpa mengurangi atau menambah datanya.
Pada array dengan dimensi lebih dari dua, .T membalik seluruh urutan sumbu, bukan sekadar menukar dua sumbu terdepan. Perilakunya setara dengan memanggil transpose() dengan urutan sumbu terbalik secara lengkap.
import numpy as np
b = np.arange(24).reshape(2, 3, 4)
print(np.array_equal(b.T, b.transpose(2, 1, 0)))TrueArray b berbentuk (2, 3, 4), dan b.T menghasilkan (4, 3, 2) karena ketiga sumbunya dibalik urutannya sekaligus. Apabila hanya sebagian sumbu yang perlu ditukar, gunakan transpose() atau np.swapaxes sebagaimana dijelaskan pada bagian transpose dengan urutan sumbu bebas.
transpose dengan urutan sumbu bebas#
Metode transpose() menerima urutan sumbu sebagai argumen dan menyusun ulang sumbu mengikuti urutan itu. Argumen (1, 0) pada array dua dimensi menghasilkan transpose biasa, sedangkan urutan lain memungkinkan perputaran yang tidak dapat dicapai .T.
import numpy as np
a = np.arange(6).reshape(2, 3)
print(np.array_equal(a.T, a.transpose(1, 0)))
b = np.arange(24).reshape(2, 3, 4)
print(b.shape)
print(b.transpose(2, 0, 1).shape)True
(2, 3, 4)
(4, 2, 3)Perbandingan pertama menegaskan bahwa a.transpose(1, 0) identik dengan a.T. Pada array tiga dimensi, b.transpose(2, 0, 1) meminta sumbu terakhir menjadi sumbu pertama, sehingga bentuk (2, 3, 4) berubah menjadi (4, 2, 3). Urutan argumen adalah urutan sumbu lama yang diinginkan sebagai sumbu baru, dan setiap sumbu wajib muncul tepat satu kali.
Apabila yang dibutuhkan hanya penukaran dua sumbu tertentu dan sumbu lainnya tetap, np.swapaxes menyatakannya tanpa menyebut seluruh urutan.
import numpy as np
b = np.arange(24).reshape(2, 3, 4)
print(np.swapaxes(b, 0, 2).shape)(4, 3, 2)Pemanggilan np.swapaxes(b, 0, 2) menukar sumbu 0 dan sumbu 2 dari b, sehingga bentuknya (4, 3, 2) tanpa mengubah kedudukan sumbu tengah. Hasilnya sama dengan b.transpose(2, 1, 0). Untuk array dua dimensi, np.swapaxes(a, 0, 1) juga setara dengan a.T, sehingga pilihan di antara ketiganya adalah perkara keterbacaan.
Transpose adalah view#
Transpose tidak memindahkan satu byte data pun. Yang berubah hanya metadata yang menyatakan urutan pembacaan, yaitu bentuk dan strides, yakni pola lompatan memori antar elemen, sehingga hasilnya adalah view yang berbagi buffer data dengan array asalnya. Sifat ini menjadikan transpose operasi yang murah sekaligus operasi yang perlu diwaspadai ketika array hasilnya dimodifikasi.
import numpy as np
a = np.arange(6).reshape(2, 3)
t = a.T
print(np.shares_memory(a, t))
t[2, 0] = 99
print(a[0, 2])True
99Pemanggilan np.shares_memory(a, t) melaporkan True, dan penugasan pada t[2, 0] terbawa ke a[0, 2] karena keduanya menunjuk elemen yang sama. Perilaku ini berlaku untuk .T, transpose(), maupun np.swapaxes, karena ketiganya hanya mengatur ulang cara membaca buffer yang sama. Mutasi pada array hasil transpose dengan demikian sama berbahayanya dengan mutasi pada hasil slicing, dan .copy() tetap menjadi pelindungnya. Perilaku view pada transpose melengkapi perilaku view pada slicing yang dibahas pada modul pengindeksan, dan keduanya memakai alat pemeriksa yang sama, yaitu np.shares_memory.
Hubungan dengan broadcasting#
Transpose sering digunakan bersama aturan broadcasting, yaitu mekanisme NumPy yang memperluas operand berbentuk kecil pada operasi aritmetika antar array. Perbedaan antara bentuk (1, 3) dan (3, 1) menentukan arah perluasan tersebut, dan transpose adalah cara mengubah salah satunya menjadi yang lain.
import numpy as np
v = np.array([1, 2, 3])
baris = v.reshape(1, 3)
kolom = baris.T
print(baris.shape)
print(kolom.shape)
print(kolom + baris)(1, 3)
(3, 1)
[[2 3 4]
[3 4 5]
[4 5 6]]Array baris berbentuk (1, 3) dan kolom hasil transpose-nya berbentuk (3, 1). Ketika keduanya dijumlahkan, broadcasting memperluas (3, 1) ke samping dan (1, 3) ke bawah, sehingga hasilnya matriks (3, 3) berisi seluruh penjumlahan berpasangan. Pola ini adalah cara baku membangun tabel penjumlahan atau perkalian luar dari satu vektor, dan transposelah yang menyediakan orientasi kolomnya.
Hubungan ini juga menjelaskan mengapa bentuk (3,) polos tidak memiliki arah pada broadcasting. Vektor satu dimensi tidak memiliki sumbu kedua untuk ditukar, sehingga orientasi baris atau kolom harus diciptakan lebih dahulu melalui reshape, kemudian transpose mengubahnya bila perlu.
Kesalahan umum#
Kesalahan yang lazim adalah mengharapkan .T membalik urutan elemen pada array satu dimensi. Faktanya, array satu dimensi hanya memiliki satu sumbu, sehingga tidak ada yang dapat ditukar dan hasilnya identik dengan asalnya.
import numpy as np
v = np.array([1, 2, 3])
print(v.T.shape)
print(v.shape)(3,)
(3,)Bentuk (3,) tetap (3,) setelah .T dipanggil, dan isi arraynya tidak berubah sama sekali. Apabila maksudnya membalik urutan elemen, gunakan slicing terbalik v[::-1], sedangkan apabila maksudnya mengubah orientasi menjadi baris atau kolom, gunakan reshape sebagaimana ditunjukkan pada bagian broadcasting. Pemahaman bahwa transpose bekerja pada sumbu, bukan pada elemen, mencegah kedua kekeliruan ini. Perbedaan ini juga menjelaskan mengapa .T tidak memiliki padanan langsung untuk membalik elemen, karena membalik urutan adalah operasi pada elemen, sedangkan transpose bekerja pada sumbunya.
Ringkasan#
.Tmenukar sumbu pada array dua dimensi, sehingga bentuk(2, 3)menjadi(3, 2)dan baris menjadi kolom.transpose()menerima urutan sumbu bebas untuk dimensi berapa pun, sedangkannp.swapaxesmenukar dua sumbu tertentu tanpa menyebut sisanya.- Seluruh operasi transpose menghasilkan view yang berbagi buffer dengan array asal, sehingga mutasi padanya terbawa ke asalnya.
- Transpose menyediakan orientasi kolom
(n, 1)yang dibutuhkan broadcasting, sedangkan.Tpada array satu dimensi tidak berpengaruh apa pun.
Referensi#
- numpy.transpose — NumPy — Dokumentasi transpose beserta semantik urutan sumbunya.
- numpy.swapaxes — NumPy — Dokumentasi penukaran dua sumbu pada array berdimensi berapa pun.
- Broadcasting — NumPy — Panduan resmi aturan broadcasting yang berkaitan dengan orientasi bentuk.