Data di dalam ndarray tersimpan sebagai deretan nilai yang berdampingan di memori, sementara bentuk (shape) hanyalah “cara membaca” deretan tersebut. Data penjualan 12 bulan dapat kita baca sebagai vektor (12,), matriks (3, 4), atau (4, 3) tanpa memindahkan satu byte pun. Kemampuan mengganti cara pembacaan inilah yang diberikan oleh reshape.

Bab ini membahas method .reshape(), padanan fungsinya np.reshape(), dimensi wildcard -1, sifat hasil reshape sebagai view, serta error yang muncul ketika jumlah elemen tidak cocok. Semua contoh memakai data penjualan enam bulan yang sama agar perubahan bentuknya mudah dilacak.

Mengubah Bentuk tanpa Mengubah Data #

Aturan inti reshape hanya satu: total elemen bentuk baru wajib sama dengan total elemen array asal. NumPy lalu membagi urutan elemen mengikuti urutan baris, yaitu elemen pertama sampai ketiga mengisi baris pertama, dan seterusnya.

python
import numpy as np

penjualan = np.array([120, 135, 150, 128, 142, 160])
print(penjualan.shape)
matriks = penjualan.reshape(2, 3)
print(matriks)
print(matriks.shape)

Output yang Dihasilkan:

text
(6,)
[[120 135 150]
 [128 142 160]]
(2, 3)

Mari kita bedah baris demi baris:

  1. Baris 3 (np.array(...)): interpreter membuat array 1-D bernama penjualan dengan enam elemen.
  2. Baris 4 (print(penjualan.shape)): cetak (6,), artinya satu dimensi berisi enam elemen.
  3. Baris 5 (penjualan.reshape(2, 3)): NumPy memeriksa syarat 2 * 3 == 6, lalu mengembalikan array baru yang membaca data yang sama sebagai dua baris kali tiga kolom. Tidak ada elemen yang dihitung ulang atau dipindah.
  4. Baris 6-7 (print): matriks tampil dalam dua baris; tiga nilai pertama menjadi baris pertama, tiga nilai berikutnya menjadi baris kedua.

Perhatikan bahwa isi elemen tetap 120, 135, 150, ... sesuai urutan aslinya; reshape hanya mengganti tata letak logisnya.

Dimensi Wildcard -1 #

Sering kali kita hanya yakin dengan salah satu dimensi, misalnya “bagi tiga wilayah, sisanya hitung sendiri”. Untuk kasus itu kita menulis -1 pada satu dimensi, dan NumPy menghitung ukurannya dari total elemen. Hanya satu dimensi yang boleh bernilai -1.

python
import numpy as np

penjualan = np.array([120, 135, 150, 128, 142, 160])
per_wilayah = penjualan.reshape(3, -1)
print(per_wilayah.shape)
print(per_wilayah)
sama = np.reshape(penjualan, (2, 3))
print(np.array_equal(sama, penjualan.reshape(2, 3)))

Output yang Dihasilkan:

text
(3, 2)
[[120 135]
 [150 128]
 [142 160]]
True

Penjelasan baris penting:

  1. Baris 4 (reshape(3, -1)): NumPy menghitung -1 sebagai 6 / 3 = 2, sehingga hasilnya berbentuk (3, 2).
  2. Baris 7 (np.reshape(penjualan, (2, 3))): bentuk fungsi dari reshape. Fungsi ini menerima array dan tuple bentuk tujuan, dan hasilnya identik dengan method yang dipanggil pada array, seperti dibuktikan np.array_equal yang mencetak True.
  3. Baris 8: np.array_equal membandingkan isi dua array; True berarti method dan fungsi memberikan hasil yang sama.

Gunakan bentuk fungsi ketika bentuk tujuan disimpan dalam variabel tuple, karena np.reshape(a, bentuk_tujuan) terbaca lebih alami daripada a.reshape(*bentuk_tujuan).

reshape Mengembalikan View bila Memungkinkan #

reshape umumnya tidak menyalin data; hasilnya adalah view, yaitu array yang berbagi buffer memori dengan array asal. Kita bisa membuktikannya lewat atribut .base dan lewat uji mutasi.

python
import numpy as np

penjualan = np.array([120, 135, 150, 128, 142, 160])
matriks = penjualan.reshape(2, 3)
print(matriks.base is penjualan)
matriks[0, 0] = 999
print(penjualan[0])
transposed = matriks.T
salin = transposed.reshape(2, 3)
print(np.shares_memory(salin, penjualan))

Output yang Dihasilkan:

text
True
999
False

Baris demi baris:

  1. Baris 4 (matriks.base is penjualan): atribut .base menunjuk ke array pemilik buffer. Hasil True berarti matriks hanyalah cara pandang lain atas penjualan.
  2. Baris 5-6 (uji mutasi): mengubah matriks[0, 0] ikut mengubah penjualan[0] menjadi 999. Ini bukti paling nyata bahwa keduanya berbagi memori.
  3. Baris 7-9 (kasus pengecualian): transposed adalah hasil transpose yang tata letak memorinya tidak bisa dibaca ulang sebagai (2, 3) tanpa penataan. NumPy lalu menyalin data, dan np.shares_memory mencetak False.

Jadi frasa “bila memungkinkan” bermakna serius: biasanya view, tetapi pada array dengan tata letak memori tertentu (misalnya hasil transpose) reshape menghasilkan salinan.

Error Ketika Jumlah Elemen Tidak Cocok #

Bila total elemen bentuk baru berbeda dari total elemen array, NumPy menolak dengan ValueError. Kita bungkus dalam try/except agar pesannya bisa diamati tanpa menghentikan program.

python
import numpy as np

penjualan = np.array([120, 135, 150, 128, 142, 160])
try:
    penjualan.reshape(4, 2)
except ValueError as e:
    print("ValueError:", e)

Output yang Dihasilkan:

text
ValueError: cannot reshape array of size 6 into shape (4,2)

Pesan error ini informatif: size 6 adalah jumlah elemen array asal, sedangkan (4,2) adalah bentuk tujuan yang meminta 4 * 2 = 8 elemen. Karena 8 != 6, operasi gagal sebelum ada data yang disentuh. Saat menerima pesan serupa, hitung dulu a.size dibandingkan hasil kali dimensi tujuan; sering kali salah satunya cukup ditulis -1 agar NumPy yang menghitung.