Menambah dan menghapus dimensi adalah pekerjaan kecil yang muncul hampir setiap hari: laporan butuh vektor kolom, fungsi pustaka menuntut array 2-D, atau sumbu palsu hasil baca file harus dibuang. Bab-bab sebelumnya memperkenalkan alat-alatnya satu per satu; bab ini mengumpulkannya menjadi satu peta keputusan.
Kita akan membandingkan tiga cara menambah dimensi dan tiga cara menghapusnya pada data yang sama, lalu merangkum semuanya dalam satu tabel agar mudah dipilih saat menulis kode.
Tiga Cara Menambah Dimensi #
Ketiganya mengubah (3,) menjadi (1, 3), tetapi gaya penulisannya berbeda.
import numpy as np
suhu = np.array([27.5, 28.1, 26.9])
a = suhu[np.newaxis, :]
b = np.expand_dims(suhu, axis=0)
c = suhu.reshape(1, -1)
print(a.shape, b.shape, c.shape)
print(np.array_equal(a, b) and np.array_equal(b, c))Output yang Dihasilkan:
(1, 3) (1, 3) (1, 3)
TrueBaris demi baris:
- Baris 4 (
suhu[np.newaxis, :]): cara indexing;np.newaxismenyisipkan sumbu di posisi tempat ia ditulis. Paling ringkas saat menulis ekspresi langsung. - Baris 5 (
np.expand_dims(suhu, axis=0)): cara fungsi; paling eksplisit dan posisinya bisa berasal dari variabel, termasuk nilai negatif sepertiaxis=-1. - Baris 6 (
suhu.reshape(1, -1)): cara reshape;-1menyerahkan hitungan ke NumPy. Cocok bila bentuk tujuan sudah dihitung dalam satu ekspresi. - Baris 8:
np.array_equalmengonfirmasi ketiganya menghasilkan nilai dan bentuk yang sama.
Ketiganya juga menghasilkan view: data tidak disalin, hanya metadata bentuknya yang ditulis ulang. Bila hasil akan dimodifikasi dan array asal harus tetap utuh, panggil .copy() pada hasilnya.
Untuk menambah sumbu di belakang menjadi (3, 1), polanya sama: suhu[:, np.newaxis], np.expand_dims(suhu, axis=1), atau suhu.reshape(-1, 1).
Tiga Cara Menghapus Dimensi #
Sekarang kita mulai dari (1, 2, 3) dan kembali ke (2, 3) dengan tiga gaya berbeda.
import numpy as np
data = np.arange(6).reshape(1, 2, 3)
d1 = np.squeeze(data)
d2 = data.reshape(2, 3)
d3 = data[0]
print(d1.shape, d2.shape, d3.shape)
print(np.array_equal(d1, d2) and np.array_equal(d2, d3))Output yang Dihasilkan:
(2, 3) (2, 3) (2, 3)
TruePenjelasan:
- Baris 4 (
np.squeeze(data)): membuang sumbu berukuran satu secara otomatis; aman dipanggil tanpaaxiskarena tidak error bila tidak ada sumbu yang memenuhi syarat. - Baris 5 (
data.reshape(2, 3)): menetapkan bentuk akhir secara eksplisit; total elemen wajib cocok. - Baris 6 (
data[0]): indexing biasa yang mengambil isi sumbu pertama; hanya sumbu pertama yang terbuang, dan hasilnya view. - Baris 8: ketiga hasil bernilai sama, sehingga perbandingan mencetak
True.
Perbedaan pentingnya ada pada fleksibilitas: squeeze menyesuaikan diri dengan sumbu berukuran satu yang ada, reshape menuntut kita menulis bentuk akhir, dan indexing hanya menyentuh sumbu pertama. Perlu diingat pula bahwa data[0] membuang sumbu pertama apa pun ukurannya — bukan hanya sumbu berukuran satu — sehingga (2, 3) menjadi (3,) saat dibaca data[0].
Tabel Ringkasan dan Uji Bolak-Balik #
Tabel berikut merangkum semua pilihan pada bab-bab section ini:
| Tujuan | Cara | Catatan |
|---|---|---|
| Tambah sumbu di depan | a[np.newaxis, :] | ringkas; alias a[None, :] |
| Tambah sumbu di posisi mana pun | np.expand_dims(a, axis=k) | paling eksplisit; k bisa negatif |
| Tambah sumbu lewat bentuk | a.reshape(1, -1) | sekalian mengatur dimensi lain |
| Hapus semua sumbu berukuran satu | np.squeeze(a) | tanpa axis, selalu berhasil |
| Hapus satu sumbu tertentu | np.squeeze(a, axis=k) | error bila ukuran sumbu k bukan satu |
| Hapus sumbu lewat bentuk | a.reshape(2, 3) | total elemen wajib cocok |
| Buang sumbu pertama | a[0] | hasil view; sumbu lain tetap |
Sebagai penutup, kita uji bahwa jalan masuk dan jalan keluarnya saling menyambung: tambah sumbu lewat indexing, lalu buang kembali sumbu yang sama lewat squeeze.
import numpy as np
harga = np.array([15000, 20000, 25000])
kolom = harga[:, np.newaxis]
print(kolom.shape)
kembali = np.squeeze(kolom, axis=1)
print(kembali.shape)
print(np.array_equal(kembali, harga))Output yang Dihasilkan:
(3, 1)
(3,)
TrueMari kita bedah:
- Baris 4 (
harga[:, np.newaxis]): vektor harga menjadi vektor kolom(3, 1), siap dipakai untuk broadcasting. - Baris 6 (
np.squeeze(kolom, axis=1)): sumbu 1 yang berukuran satu dibuang secara terarah; bentuk kembali(3,). - Baris 8:
np.array_equalmemastikan nilaikembaliidentik denganhargaasal, sehingga tercetakTrue.