Indexing satu elemen sering kali tidak cukup. Laporan nilai mungkin hanya membutuhkan tiga skor terakhir, sedangkan laporan cabang membutuhkan segmen baris dan kolom dari tabel penjualan. Untuk kebutuhan rentang semacam ini, NumPy menyediakan slicing dengan sintaks a[start:stop:step] — satu notasi ringkas untuk mengambil banyak elemen sekaligus.
Sintaks start:stop:step #
Kita coba kelima variasi slice pada array nilai ujian yang sama:
import numpy as np
nilai = np.array([78, 85, 92, 69, 88, 95, 73, 81])
print(nilai[2:5])
print(nilai[:3])
print(nilai[5:])
print(nilai[:])
print(nilai[1:7:2])Output yang Dihasilkan:
[92 69 88]
[78 85 92]
[95 73 81]
[78 85 92 69 88 95 73 81]
[85 69 95]Bedah baris demi baris:
- Baris 3 (
nilai[2:5]): mengambil indeks 2, 3, dan 4. Batasstopbersifat eksklusif — elemen pada indeks 5 tidak ikut — sehingga jumlah elemen hasil selalustop - startketika langkahnya 1. - Baris 4 (
nilai[:3]):startyang dikosongkan berarti default0, sehingga tercetak tiga elemen pertama. - Baris 5 (
nilai[5:]):stopyang dikosongkan berarti sampai akhir dimensi, yaitu indeks 5, 6, 7. - Baris 6 (
nilai[:]): keduanya kosong, sehingga seluruh elemen ikut terpilih. - Baris 7 (
nilai[1:7:2]):stepbernilai 2 membuat slice melompat: indeks 1, 3, 5 — berhenti sebelum mencapai 7.
Tabel ringkasan berikut memetakan tiap ekspresi ke indeks yang diambil:
| Ekspresi | Indeks yang diambil | Hasil |
|---|---|---|
nilai[2:5] | 2, 3, 4 | [92 69 88] |
nilai[:3] | 0, 1, 2 | [78 85 92] |
nilai[5:] | 5, 6, 7 | [95 73 81] |
nilai[1:7:2] | 1, 3, 5 | [85 69 95] |
nilai[:] | seluruhnya | array penuh |
Ketiga parameter memiliki nilai default: start bernilai 0, stop bernilai panjang dimensi, dan step bernilai 1. Karena itu kita bebas mengisi sebagian saja — nilai[:5], nilai[3:], atau nilai[::2] — dan sisanya otomatis mengikuti default.
Slicing pada Array Dua Dimensi #
Pada array dua dimensi, kita memberikan dua rentang yang dipisah koma: rentang baris terlebih dahulu, lalu rentang kolom. Hasilnya sebuah submatriks:
import numpy as np
penjualan = np.array([
[12, 15, 9, 20],
[8, 14, 11, 17],
[19, 6, 13, 10],
])
sub = penjualan[0:2, 1:3]
print(sub)
print(np.array_equal(sub, penjualan[0:2][:, 1:3]))Output yang Dihasilkan:
[[15 9]
[14 11]]
TrueBedah baris demi baris:
penjualan[0:2, 1:3]: rentang pertama memilih baris 0 sampai 1, rentang kedua memilih kolom 1 sampai 2. Hasilnya submatriks 2 x 2 berisi[[15 9] [14 11]].penjualan[0:2][:, 1:3]: bentuk berantai — slice slice. Slice pertama menghasilkan array dua baris, kemudian slice kedua[:, 1:3]diterapkan pada array perantara tersebut.np.array_equal(...): membandingkan isi kedua hasil dan mencetakTrue, membuktikan bentuk tuple dan bentuk berantai ekuivalen.
Sebagaimana dibahas pada Chapter Indexing Array Multidimensi, bentuk tuple dalam satu kurung tetap lebih disarankan: satu operasi indexing tanpa array perantara.
Hasil Slice adalah View, Bukan Salinan #
Bagian ini penting: slicing tidak menyalin data. Hasil slice berupa view — array baru yang metadata-nya menunjuk ke buffer memori yang sama dengan array asal. Kita buktikan dengan mengubah isi view:
import numpy as np
nilai = np.array([78, 85, 92, 69, 88])
potongan = nilai[2:5]
potongan[0] = 100
print(potongan)
print(nilai)Output yang Dihasilkan:
[100 69 88]
[ 78 85 100 69 88]Baris potongan[0] = 100 menulis ke sel pertama view, dan view tersebut menunjuk langsung ke buffer nilai. Akibatnya array asal ikut berubah: elemen indeks 2 kini bernilai 100, terlihat saat print(nilai) dijalankan. Perilaku ini menghemat memori karena data tidak diduplikasi, tetapi menuntut kehati-hatian.