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.
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:
(1, 2, 3)
(2, 3)
[[0 1 2]
[3 4 5]]Baris demi baris:
- Baris 3: kita membuat array
(1, 2, 3); sumbu pertama berukuran satu dan tidak menambah informasi. - Baris 5 (
np.squeeze(data)): NumPy memeriksa setiap dimensi dan membuang yang berukuran satu, sehingga bentuk menjadi(2, 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.
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:
(2, 3)
ValueError: cannot select an axis to squeeze out which has size not equal to onePenjelasan:
- Baris 4 (
np.squeeze(data, axis=0)): hanya sumbu 0 yang dibuang; hasilnya(2, 3), sama seperti tanpaaxiskarena memang hanya satu sumbu berukuran satu. - Baris 5-7:
axis=1menargetkan sumbu yang berukuran 2, sehingga NumPy menolak denganValueError. 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.
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:
(1, 0)
(0,)
()Mari kita bedah:
- 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. - Baris 6-7: array
(1,)menjadi array 0-d berbentuk(). Setelah menjadi 0-d, indexing sepertihasil[0]tidak lagi sah dan akan melemparIndexError.
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.