Setiap array NumPy menyimpan metadata yang menjelaskan cara elemen-elemennya disusun, dan atribut shape adalah metadata yang paling sering kita periksa. Shape berupa tuple berisi panjang setiap dimensi: (6,) berarti enam elemen dalam satu baris, sedangkan (3, 4) berarti tabel dengan tiga baris dan empat kolom. Hampir semua operasi NumPy, dari broadcasting hingga indexing, berpijak pada shape array yang terlibat.

Sebagai contoh berjalan, kita memakai catatan penjualan sebuah jaringan toko dalam satuan juta rupiah. Data yang sama akan kita naikkan tingkat kompleksitasnya: penjualan per cabang, penjualan harian beberapa cabang, hingga penjualan yang terkelompok per wilayah. Dengan contoh yang konsisten, arti setiap angka pada tuple shape terasa konkret.

Arti tuple shape untuk setiap dimensi #

Panjang tuple shape selalu sama dengan jumlah dimensi array, dan setiap posisi dalam tuple menjelaskan satu axis. Posisi pertama adalah panjang axis terluar, posisi kedua adalah panjang axis di dalamnya, dan seterusnya. Mari kita baca shape tiga array penjualan berikut.

python
import numpy as np

penjualan_cabang = np.array([120, 95, 143, 88, 210, 176])
penjualan_harian = np.array([
    [85, 90, 78, 102],
    [64, 71, 69, 80],
    [110, 98, 105, 123],
])
penjualan_wilayah = np.array([
    [[85, 90, 78, 102], [64, 71, 69, 80], [110, 98, 105, 123]],
    [[70, 75, 82, 88], [58, 62, 60, 71], [95, 99, 91, 104]],
])

print(penjualan_cabang.shape)
print(penjualan_harian.shape)
print(penjualan_wilayah.shape)
print(len(penjualan_cabang) == penjualan_cabang.shape[0])

Output yang Dihasilkan:

text
(6,)
(3, 4)
(2, 3, 4)
True

Mari kita bedah kode di atas baris demi baris:

  1. Baris 3 (penjualan_cabang = np.array([...])): interpreter mengubah list enam angka menjadi array 1-D. Axis tunggalnya memuat enam elemen, sehingga shape-nya (6,).
  2. Baris 4-8 (penjualan_harian = np.array([...])): list bersarang dua tingkat menjadi array 2-D. Ada tiga baris cabang dan setiap baris memuat empat nilai hari, sehingga shape-nya (3, 4).
  3. Baris 9-12 (penjualan_wilayah = np.array([...])): list bersarang tiga tingkat menjadi array 3-D dengan shape (2, 3, 4): dua wilayah, masing-masing tiga cabang, masing-masing empat hari.
  4. Baris 14-16 (print(...shape)): interpreter menampilkan tuple shape dari masing-masing array.
  5. Baris 17 (len(...) == ...shape[0]): untuk array 1-D, len() menghitung panjang axis pertama sehingga hasilnya persis shape[0]; perbandingannya bernilai True.

Tabel berikut merangkum arti setiap bentuk pada contoh kita:

Bentuk arrayArti tuple shapeContoh penjualan kita
1-D(n,): satu axis, n elemen(6,): enam cabang
2-D(baris, kolom)(3, 4): tiga cabang, empat hari
3-D(p, q, r): tiga axis bersarang(2, 3, 4): dua wilayah, tiga cabang, empat hari

NumPy mengizinkan kita menugaskan tuple baru langsung ke atribut shape. Penugasan ini legal selama jumlah total elemen tidak berubah; NumPy hanya membaca ulang tata letak elemen yang ada tanpa menyalin data maupun mengubah nilai. Bila total elemen tidak cocok, interpreter menolak penugasan dengan ValueError.

python
import numpy as np

penjualan = np.array([85, 90, 78, 102, 64, 71])
print(penjualan.shape)

penjualan.shape = (2, 3)
print(penjualan)
print(penjualan.shape)

try:
    penjualan.shape = (4, 2)
except ValueError as e:
    print("ValueError:", e)

Output yang Dihasilkan:

text
(6,)
[[ 85  90  78]
 [102  64  71]]
(2, 3)
ValueError: cannot reshape array of size 6 into shape (4,2)

Perhatikan apa yang dilakukan setiap baris:

  1. Baris 3-4: kita membuat array 1-D berisi enam nilai dan menampilkan shape awalnya (6,).
  2. Baris 6 (penjualan.shape = (2, 3)): total elemen 2 × 3 = 6 sama dengan jumlah elemen array, sehingga penugasan berhasil; enam nilai lama kini tersusun menjadi dua baris.
  3. Baris 7-8: isi array tercetak sebagai matriks 2 × 3 dan shape tercetak (2, 3).
  4. Baris 10-13 (try ... except): penugasan (4, 2) meminta 4 × 2 = 8 slot padahal array hanya punya 6 elemen. NumPy menolaknya dengan ValueError, dan blok except mencetak pesan lengkapnya sehingga skrip tetap berjalan.

Hubungan shape dengan len() #

Untuk array 1-D, len(array) sama dengan shape[0], sehingga keduanya bisa saling menggantikan. Pola ini berbeda pada array multi-dimensi: len() selalu menghitung panjang axis pertama saja, bukan total elemen. Kita uji langsung pada array penjualan harian berbentuk (3, 4).

python
import numpy as np

penjualan_harian = np.array([
    [85, 90, 78, 102],
    [64, 71, 69, 80],
    [110, 98, 105, 123],
])

print(len(penjualan_harian))
print(penjualan_harian.shape[0])

Output yang Dihasilkan:

text
3
3

Kedua baris terakhir menghasilkan 3 karena len() membaca axis pertama, yaitu jumlah baris. Total elemen array ini sebenarnya 12, dan angka itulah yang dihitung atribut size — akan kita bahas pada Chapter Atribut size.