Hasil membaca file, memotong array, atau memanggil fungsi pustaka lain sering membawa sumbu palsu berukuran satu: data stok yang seharusnya (2, 3) tiba dalam bentuk (1, 2, 3). Sumbu palsu membuat indexing menjadi lebih panjang dan perbandingan bentuk menjadi gagal, padahal tidak ada informasi tambahan di dalamnya.

np.squeeze menghilangkan sumbu berukuran satu dari array — kebalikan dari expand_dims. Bab ini membahas pemakaian dasar, parameter axis untuk menargetkan sumbu tertentu beserta errornya, dan jebakan yang muncul ketika array berukuran nol ikut terlibat.

Menghilangkan Sumbu Berukuran Satu #

Tanpa argumen tambahan, squeeze membuang semua sumbu yang berukuran satu sekaligus.

python
import numpy as np

data = np.arange(6).reshape(1, 2, 3)
print(data.shape)
ringkas = np.squeeze(data)
print(ringkas.shape)
print(ringkas)

Output yang Dihasilkan:

text
(1, 2, 3)
(2, 3)
[[0 1 2]
 [3 4 5]]

Baris demi baris:

  1. Baris 3: kita membuat array (1, 2, 3); sumbu pertama berukuran satu dan tidak menambah informasi.
  2. Baris 5 (np.squeeze(data)): NumPy memeriksa setiap dimensi dan membuang yang berukuran satu, sehingga bentuk menjadi (2, 3).
  3. Baris 7: isi enam elemen tidak berubah; hanya “pembungkus” kosongnya yang dibuang.

Hasil squeeze adalah view yang berbagi memori dengan array asal, sama seperti hasil reshape. Karena itu, expand_dims dan squeeze saling menjadi kebalikan yang setia: sumbu yang disisipkan lewat expand_dims dapat dibuang kembali dengan squeeze tanpa menyalin data. Pola bolak-balik ini akan kita uji pada Chapter Menambah dan Menghapus Dimensi.

Menargetkan Satu Sumbu dengan axis #

Bila kita hanya ingin membuang satu sumbu tertentu, sebut posisinya lewat axis. NumPy menolak permintaan yang menargetkan sumbu yang ukurannya bukan satu.

python
import numpy as np

data = np.arange(6).reshape(1, 2, 3)
print(np.squeeze(data, axis=0).shape)
try:
    np.squeeze(data, axis=1)
except ValueError as e:
    print("ValueError:", e)

Output yang Dihasilkan:

text
(2, 3)
ValueError: cannot select an axis to squeeze out which has size not equal to one

Penjelasan:

  1. Baris 4 (np.squeeze(data, axis=0)): hanya sumbu 0 yang dibuang; hasilnya (2, 3), sama seperti tanpa axis karena memang hanya satu sumbu berukuran satu.
  2. Baris 5-7: axis=1 menargetkan sumbu yang berukuran 2, sehingga NumPy menolak dengan ValueError. Pesannya menyebut penyebabnya langsung: sumbu yang diminta untuk disqueeze tidak berukuran satu.

Error ini sebenarnya pengaman yang berguna: bila axis ditentukan eksplisit, kita menyatakan “sumbu ini pasti berukuran satu”. Bila asumsi itu keliru, NumPy memberi tahu alih-alih membungkamnya. Kontrastnya dengan pemanggilan tanpa axis, yang selalu berhasil tanpa peduli ada atau tidaknya sumbu berukuran satu.

Jebakan Array Berukuran Nol #

Squeeze tidak membedakan sumbu berukuran satu yang “berisi” dengan sumbu berukuran satu yang kosong; keduanya dibuang dengan cara yang sama.

python
import numpy as np

kosong = np.zeros((1, 0))
print(kosong.shape)
print(np.squeeze(kosong).shape)
skalar = np.array([42])
print(np.squeeze(skalar).shape)

Output yang Dihasilkan:

text
(1, 0)
(0,)
()

Mari kita bedah:

  1. Baris 3-5: array (1, 0) tidak memuat elemen apa pun, tetapi sumbu pertamanya berukuran satu, sehingga squeeze menghasilkan (0,) — array 1-D yang kosong. Dimensi dua array asalnya ikut tertelan.
  2. Baris 6-7: array (1,) menjadi array 0-d berbentuk (). Setelah menjadi 0-d, indexing seperti hasil[0] tidak lagi sah dan akan melempar IndexError.

Daftar aturan squeeze yang perlu diingat:

  • Tanpa axis: semua sumbu berukuran satu dibuang sekaligus; pemanggilan selalu berhasil.
  • Dengan axis: hanya sumbu itu yang dibuang; error bila ukurannya bukan satu.
  • Hasilnya view; mengubah hasil squeeze mengubah array asal.
  • Sumbu berukuran nol tidak pernah dibuang, tetapi sumbu satu di sekitarnya tetap dibuang.