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.

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

text
(1, 3) (1, 3) (1, 3)
True

Baris demi baris:

  1. Baris 4 (suhu[np.newaxis, :]): cara indexing; np.newaxis menyisipkan sumbu di posisi tempat ia ditulis. Paling ringkas saat menulis ekspresi langsung.
  2. Baris 5 (np.expand_dims(suhu, axis=0)): cara fungsi; paling eksplisit dan posisinya bisa berasal dari variabel, termasuk nilai negatif seperti axis=-1.
  3. Baris 6 (suhu.reshape(1, -1)): cara reshape; -1 menyerahkan hitungan ke NumPy. Cocok bila bentuk tujuan sudah dihitung dalam satu ekspresi.
  4. Baris 8: np.array_equal mengonfirmasi 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.

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

text
(2, 3) (2, 3) (2, 3)
True

Penjelasan:

  1. Baris 4 (np.squeeze(data)): membuang sumbu berukuran satu secara otomatis; aman dipanggil tanpa axis karena tidak error bila tidak ada sumbu yang memenuhi syarat.
  2. Baris 5 (data.reshape(2, 3)): menetapkan bentuk akhir secara eksplisit; total elemen wajib cocok.
  3. Baris 6 (data[0]): indexing biasa yang mengambil isi sumbu pertama; hanya sumbu pertama yang terbuang, dan hasilnya view.
  4. 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:

TujuanCaraCatatan
Tambah sumbu di depana[np.newaxis, :]ringkas; alias a[None, :]
Tambah sumbu di posisi mana punnp.expand_dims(a, axis=k)paling eksplisit; k bisa negatif
Tambah sumbu lewat bentuka.reshape(1, -1)sekalian mengatur dimensi lain
Hapus semua sumbu berukuran satunp.squeeze(a)tanpa axis, selalu berhasil
Hapus satu sumbu tertentunp.squeeze(a, axis=k)error bila ukuran sumbu k bukan satu
Hapus sumbu lewat bentuka.reshape(2, 3)total elemen wajib cocok
Buang sumbu pertamaa[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.

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

text
(3, 1)
(3,)
True

Mari kita bedah:

  1. Baris 4 (harga[:, np.newaxis]): vektor harga menjadi vektor kolom (3, 1), siap dipakai untuk broadcasting.
  2. Baris 6 (np.squeeze(kolom, axis=1)): sumbu 1 yang berukuran satu dibuang secara terarah; bentuk kembali (3,).
  3. Baris 8: np.array_equal memastikan nilai kembali identik dengan harga asal, sehingga tercetak True.