Pertanyaan analisis paling awal biasanya tentang ekstrem: produk mana dengan penjualan tertinggi, nilai ujian mana yang terendah, atau di posisi berapa nilai itu berada. NumPy menjawab keduanya dengan empat fungsi yang berpasangan: min dan max mengembalikan nilai ekstrem, sedangkan argmin dan argmax mengembalikan posisi indeks ekstrem tersebut.

Perbedaan nilai versus posisi ini adalah inti bab. Kita juga akan melihat jebakan klasik argmin/argmax pada array dua dimensi dan cara membaca hasilnya dengan axis.

Nilai Terkecil dan Terbesar dengan min dan max #

python
import numpy as np

nilai = np.array([78, 85, 92, 69, 88, 95, 73, 81])
print(nilai.min(), nilai.max())
print(np.min(nilai), np.max(nilai))

Output yang Dihasilkan:

text
69 95
69 95

Kedua baris menghasilkan output yang identik. Gaya method .min() dan .max() hanya tersedia pada objek ndarray, sedangkan gaya fungsi np.min dan np.max juga menerima list Python sebelum mengonversinya menjadi array. Pilih satu gaya dan konsisten; di seluruh course ini keduanya dipakai sesuai konteks.

argmin dan argmax: Posisi, Bukan Nilai #

argmin dan argmax menjawab pertanyaan “di indeks ke berapa”, bukan “berapa nilainya”. Nilainya baru kita peroleh setelah indeks tersebut dipakai untuk indexing:

python
import numpy as np

nilai = np.array([78, 85, 92, 69, 88, 95, 73, 81])
indeks_min = nilai.argmin()
indeks_max = nilai.argmax()
print(indeks_min, indeks_max)
print(nilai[indeks_min], nilai[indeks_max])

Output yang Dihasilkan:

text
3 5
69 95

Bedah baris demi baris:

  1. Baris 3 (nilai.argmin()): fungsi ini memindai array dan mengembalikan indeks kemunculan pertama dari nilai terkecil, yaitu 3 karena nilai[3] == 69.
  2. Baris 4 (nilai.argmax()): pola yang sama untuk nilai terbesar, yang berada di indeks 5.
  3. Baris 6 (print(...)): indeks hasil argmin/argmax dipakai untuk mengambil nilainya, 69 dan 95, membuktikan bahwa keduanya memang menunjuk nilai ekstrem yang benar.

Kalau ada dua nilai yang sama-sama terbesar, argmax tetap mengembalikan satu indeks saja: kemunculan pertamanya. Tabel berikut merangkum peran keempat fungsi:

FungsiPertanyaan yang dijawabHasil pada nilai
nilai.min()Berapa nilai terkecil?69
nilai.argmin()Di indeks ke berapa nilai terkecil?3
nilai.max()Berapa nilai terbesar?95
nilai.argmax()Di indeks ke berapa nilai terbesar?5

Jebakan Indeks Flat pada Array Dua Dimensi #

Tanpa axis, argmin dan argmax memperlakukan array dua dimensi sebagai satu deret panjang yang dilipat baris demi baris, lalu mengembalikan indeks pada deret itu — disebut indeks flat:

python
import numpy as np

penjualan = np.array([
    [120, 85, 200, 65],
    [90, 150, 110, 40],
    [175, 60, 95, 130],
])
print(penjualan.min(), penjualan.max())
print(penjualan.argmin(), penjualan.argmax())
print(np.unravel_index(penjualan.argmin(), penjualan.shape))
print(np.unravel_index(penjualan.argmax(), penjualan.shape))

Output yang Dihasilkan:

text
40 200
7 2
(np.int64(1), np.int64(3))
(np.int64(0), np.int64(2))

Bedah baris demi baris:

  1. Baris 8 (penjualan.min(), penjualan.max()): tanpa axis, nilai ekstrem dicari dari seluruh 12 sel sekaligus: terkecil 40, terbesar 200.
  2. Baris 9 (penjualan.argmin(), penjualan.argmax()): hasilnya indeks flat 7 dan 2, bukan pasangan (baris, kolom). Nilai 40 berada di baris 1 kolom 3, dan 1 x 4 + 3 = 7; nilai 200 berada di baris 0 kolom 2, dan 0 x 4 + 2 = 2.
  3. Baris 10-11 (np.unravel_index(...)): fungsi ini mengubah indeks flat menjadi pasangan (baris, kolom) sesuai shape array, (1, 3) untuk 40 dan (0, 2) untuk 200. Tampilan np.int64(1) adalah gaya cetak NumPy 2.x untuk scalar integer di dalam tuple; nilainya tetap 1 dan 3.

Kalau kebutuhannya bukan satu posisi ekstrem melainkan semua elemen yang memenuhi syarat (misalnya semua produk dengan penjualan di atas 100), alat yang tepat adalah perbandingan array dan boolean indexing pada Chapter Boolean Indexing.

Mencari Ekstrem per Baris atau per Kolom #

Dengan parameter axis, pencarian ekstrem diarahkan per baris atau per kolom — aturannya sama seperti pada sum:

python
import numpy as np

penjualan = np.array([
    [120, 85, 200, 65],
    [90, 150, 110, 40],
    [175, 60, 95, 130],
])
print(penjualan.max(axis=1))
print(penjualan.argmax(axis=1))
print(penjualan.min(axis=0))

Output yang Dihasilkan:

text
[200 150 175]
[2 1 0]
[90 60 95 40]

max(axis=1) menghasilkan produk terlaris di tiap cabang: [200 150 175]. Pasangannya argmax(axis=1) memberi posisi produk tersebut per cabang: [2 1 0], artinya cabang pertama paling laku menjual produk indeks 2, cabang kedua produk indeks 1, dan cabang ketiga produk indeks 0. Sementara min(axis=0) melipat baris dan mencari penjualan terendah tiap produk antar cabang: [90 60 95 40].

Detail cara kerja axis — termasuk cara menurunkan bentuk hasilnya secara sistematis — kita bedah tuntas pada Chapter Operasi Berdasarkan Axis.