Pada Chapter Indexing Array Multidimensi kita telah mengambil satu elemen dari array dua dimensi. Dalam pekerjaan pengolahan data, kebutuhan yang jauh lebih sering muncul adalah mengambil satu baris atau satu kolom utuh: “tampilkan seluruh penjualan Cabang Semarang” atau “ambil angka penjualan produk Tas dari semua cabang”. NumPy menyediakan notasi yang ringkas untuk kedua kebutuhan tersebut dengan memadukan indeks tunggal dan slice :.

Sepanjang bab ini kita memakai satu dataset yang sama, yaitu matriks penjualan tiga cabang toko (Bandung, Semarang, Medan) untuk empat produk (Buku, Pulpen, Tas, Penggaris) dalam juta rupiah:

  • Baris ke-0, ke-1, dan ke-2 berturut-turut milik Cabang Bandung, Semarang, dan Medan.
  • Kolom ke-0 sampai ke-3 menyimpan penjualan produk Buku, Pulpen, Tas, dan Penggaris.

Yang akan kita bahas: mengambil satu baris utuh, mengambil satu kolom utuh, mengambil satu elemen dari kombinasi keduanya, dan mengubah isi satu kolom sekaligus.

Mengambil Satu Baris Utuh #

Cara tercepat mengambil seluruh isi baris ke-1 adalah penjualan[1]. Bentuk panjangnya, penjualan[1, :], menegaskan maksud kita: ambil baris ke-1 pada sumbu pertama dan semua kolom pada sumbu kedua. Keduanya menghasilkan array satu dimensi dengan isi yang identik.

python
import numpy as np

penjualan = np.array([
    [120, 85, 200, 65],
    [90, 150, 110, 40],
    [175, 60, 95, 130],
])
print(penjualan[1])
print(penjualan[1, :])
print(penjualan[2, 3])
print(penjualan[1].shape)

Output yang Dihasilkan:

text
[ 90 150 110  40]
[ 90 150 110  40]
130
(4,)

Mari kita bedah baris demi baris:

  1. Baris 2-6 (np.array(...)): kita membuat array dua dimensi berbentuk (3, 4) dari list bersarang. Tiga list di dalamnya mewakili tiga baris.
  2. Baris 7 (penjualan[1]): ketika hanya satu indeks diberikan pada array dua dimensi, NumPy memakai indeks tersebut untuk sumbu pertama (baris) dan mengambil seluruh sumbu sisanya. Hasilnya array satu dimensi [ 90 150 110 40], yaitu penjualan Cabang Semarang.
  3. Baris 8 (penjualan[1, :]): bentuk eksplisit dari ekspresi yang sama. Tanda : pada sumbu kedua berarti “semua kolom”, sehingga hasilnya persis sama dengan baris 7.
  4. Baris 9 (penjualan[2, 3]): kombinasi indeks baris dan kolom menghasilkan satu elemen tunggal, yaitu 130 (penjualan Penggaris di Medan).
  5. Baris 10 (penjualan[1].shape): bentuk (4,) menegaskan bahwa hasilnya array satu dimensi berisi empat nilai.

Perlu dicatat: karena operasi ini termasuk basic slicing, hasil baris dan kolom tersebut adalah view yang berbagi memori dengan array aslinya. Konsekuensinya kita buktikan pada Chapter View vs Copy.

Mengambil Satu Kolom Utuh #

Untuk kolom, polanya dibalik: slice : dipasang pada sumbu baris, sedangkan indeks angka dipasang pada sumbu kolom. Ekspresi penjualan[:, 1] berarti “semua baris, ambil kolom ke-1”.

python
import numpy as np

penjualan = np.array([
    [120, 85, 200, 65],
    [90, 150, 110, 40],
    [175, 60, 95, 130],
])
print(penjualan[:, 1])
print(penjualan[:, 1].shape)
print(penjualan[1].shape)

Output yang Dihasilkan:

text
[ 85 150  60]
(3,)
(4,)

Penjelasan tiap baris:

  1. Baris 7 (penjualan[:, 1]): tanda : pada sumbu pertama mengambil ketiga baris, lalu indeks 1 memilih kolom Pulpen. Hasilnya [ 85 150 60] — angka penjualan Pulpen dibaca dari atas ke bawah.
  2. Baris 8 (penjualan[:, 1].shape): bentuknya (3,) karena kolom menyusuri tiga baris.
  3. Baris 9 (penjualan[1].shape): sebagai pembanding, satu baris berbentuk (4,) karena menyusuri empat kolom. Dengan perbandingan ini kita dapat menebak bentuk hasil sebelum mengeksekusi kode.

Mengubah Isi Satu Kolom #

Karena hasil slice adalah view, penugasan ke penjualan[:, 1] langsung menulis ke buffer array asli. Kita dapat mengisi satu kolom dengan list sepanjang kolom tersebut, atau dengan satu skalar yang disebar ke semua baris melalui mekanisme broadcasting.

python
import numpy as np

penjualan = np.array([
    [120, 85, 200, 65],
    [90, 150, 110, 40],
    [175, 60, 95, 130],
])
penjualan[:, 1] = [95, 155, 70]
print(penjualan)
penjualan[:, 3] = 100
print(penjualan[:, 3])

Output yang Dihasilkan:

text
[[120  95 200  65]
 [ 90 155 110  40]
 [175  70  95 130]]
[100 100 100]

Yang terjadi di belakang layar:

  1. Baris 8 (penjualan[:, 1] = [95, 155, 70]): NumPy menulis tiga nilai baru langsung ke kolom ke-1 array asli. Tidak ada array baru yang dibuat; yang berubah adalah isi buffer milik penjualan.
  2. Baris 9 (print(penjualan)): kolom Pulpen kini berisi 95, 155, 70. Array asli berubah karena kita menulis melalui view.
  3. Baris 10 (penjualan[:, 3] = 100): satu skalar disebar ke seluruh kolom Penggaris melalui broadcasting, sehingga ketiga baris berisi 100.

Ringkasan Pola Baris dan Kolom #

EkspresiArtiBentuk hasil
penjualan[1]baris ke-1 utuh(4,)
penjualan[1, :]baris ke-1, semua kolom (bentuk eksplisit)(4,)
penjualan[:, 1]semua baris, kolom ke-1(3,)
penjualan[2, 3]satu elemen pada perpotongan baris dan kolomskalar

Dua pola di tabel ini meliputi hampir seluruh kebutuhan sehari-hari pada data tabular: a[i] (boleh juga a[i, :]) untuk satu baris dan a[:, j] untuk satu kolom. Keduanya menghasilkan array satu dimensi yang merupakan view, sementara penugasan ke pola tersebut menulis langsung ke array asli.