Jika kamu serius mendalami Python untuk data science, machine learning, atau komputasi ilmiah, ada satu library yang wajib kamu kuasai lebih dulu: NumPy. NumPy (Numerical Python) adalah fondasi dari hampir seluruh ekosistem data di Python — Pandas, Matplotlib, Scikit-learn, bahkan banyak framework deep learning dibangun di atasnya. Dalam tutorial ini, kamu akan belajar NumPy dari nol: membuat array, indexing, broadcasting, hingga memanfaatkan operasi vektor yang membuat kode kamu berjalan jauh lebih cepat dibanding loop biasa.

Apa Itu NumPy dan Mengapa Penting?

NumPy memperkenalkan objek ndarray (N-dimensional array), yaitu struktur data yang mirip list tetapi jauh lebih efisien untuk data numerik. Berbeda dengan list Python yang bisa menampung tipe data campuran, array NumPy bersifat homogen (semua elemen bertipe sama) dan disimpan secara berurutan di memori. Inilah alasan utama mengapa operasi matematis pada array NumPy berjalan sangat cepat dan hemat memori dibanding list Python biasa.

NumPy juga menjadi jembatan menuju dunia machine learning. Ketika kamu melatih model klasifikasi dengan Scikit-learn, data yang kamu masukkan ke dalam model pada dasarnya adalah array NumPy. Memahami NumPy berarti memahami bahasa dasar yang dipakai seluruh ekosistem data Python.

Tips: jangan menulis ulang loop for untuk operasi matematis pada array — gunakan operasi vektor NumPy. Selain lebih singkat, kodenya bisa puluhan hingga ratusan kali lebih cepat.

Persiapan: Install NumPy

NumPy bisa dipasang lewat pip dengan satu perintah sederhana. Pastikan kamu sudah menginstal Python terlebih dahulu.

bash
pip install numpy

# Cek versi yang terpasang
python -c "import numpy; print(numpy.__version__)"

Secara konvensi, NumPy diimpor dengan alias np. Konvensi ini dipakai di hampir semua dokumentasi, tutorial, dan kode open-source, jadi sebaiknya kamu ikuti juga.

Membuat Array NumPy Pertamamu

Ada banyak cara membuat array NumPy. Yang paling dasar adalah np.array() dari list Python, lalu ada fungsi-fungsi praktis seperti zeros, ones, arange, dan linspace.

python
import numpy as np

# Dari list Python
arr = np.array([1, 2, 3, 4, 5])
print(arr)        # [1 2 3 4 5]
print(type(arr))  # <class 'numpy.ndarray'>

# Array 2 dimensi (matriks)
matriks = np.array([[1, 2, 3], [4, 5, 6]])
print(matriks)

# Array berisi nol dan satu
print(np.zeros((2, 3)))   # matriks 2x3 berisi 0
print(np.ones((2, 2)))    # matriks 2x2 berisi 1

# Rentang nilai
print(np.arange(0, 10, 2))   # [0 2 4 6 8]
print(np.linspace(0, 1, 5))   # 5 titik merata dari 0 sampai 1

# Array acak (pakai Generator, cara modern)
rng = np.random.default_rng(42)
print(rng.random((3, 2)))   # matriks 3x2 nilai acak 0-1

Atribut Array: shape, dtype, ndim, dan size

Setiap array NumPy menyimpan metadata penting yang bisa kamu akses lewat atribut. Memahami atribut-atribut ini membantumu men-debug dan memahami struktur data yang sedang kamu olah.

python
a = np.arange(24).reshape(4, 6)

print(a.ndim)     # 2  (jumlah dimensi)
print(a.shape)    # (4, 6)  (bentuk: baris x kolom)
print(a.size)     # 24  (jumlah total elemen)
print(a.dtype)    # int64  (tipe data elemen)
print(a.itemsize) # 8  (byte per elemen)

Indexing dan Slicing

Indexing di NumPy sangat mirip dengan list Python, tetapi untuk array multidimensi kamu bisa mengakses elemen dengan sintaks arr[baris, kolom].

python
a = np.arange(10)
print(a[0])      # 0
print(a[-1])     # 9
print(a[2:5])    # [2 3 4]
print(a[::2])    # [0 2 4 6 8]

b = np.arange(12).reshape(3, 4)
print(b[1, 2])    # 6  (baris 1, kolom 2)
print(b[0])       # [0 1 2 3]  (baris pertama)
print(b[:, 1])    # [1 5 9]    (semua baris, kolom kedua)
print(b[1:, 2:])  # sub-matriks kanan bawah

Reshape dan Transpose

reshape() memungkinkan kamu mengubah bentuk array tanpa mengubah datanya, selama jumlah elemen total tetap sama. Nilai -1 membuat NumPy menghitung dimensi secara otomatis.

python
a = np.arange(12)

b = a.reshape(3, 4)   # ubah jadi 3 baris x 4 kolom
print(b)

# -1 berarti "hitung otomatis"
c = a.reshape(2, -1)  # 2 baris, kolom dihitung sendiri
print(c.shape)        # (2, 6)

d = b.T               # transpose: tukar baris dan kolom
print(d.shape)        # (4, 3)

Operasi Vektor dan Broadcasting

Inilah kekuatan utama NumPy: kamu bisa melakukan operasi matematis pada seluruh array sekaligus, tanpa menulis loop. Operasi semacam ini disebut vectorized operation.

python
a = np.array([1, 2, 3, 4])
print(a + 10)   # [11 12 13 14]
print(a * 2)    # [2 4 6 8]
print(a ** 2)   # [1 4 9 16]

# Broadcasting: array dengan shape berbeda dioperasikan bersama
x = np.array([[1, 2, 3], [4, 5, 6]])
y = np.array([10, 20, 30])
print(x + y)    # y "disebar" ke setiap baris

Broadcasting adalah aturan yang memungkinkan NumPy mengoperasikan dua array dengan bentuk berbeda selama dimensinya "kompatibel". Aturan praktisnya: dua dimensi cocok jika ukurannya sama, atau salah satunya bernilai 1. Berkat broadcasting, kamu tidak perlu menulis loop untuk menjumlahkan vektor ke setiap baris matriks.

Mengapa NumPy Lebih Cepat dari Loop Python Biasa?

NumPy mengimplementasikan operasi array dalam bahasa C yang terkompilasi dan memanfaatkan contiguous memory serta SIMD (instruksi vektor CPU). Alhasil, operasi vektor jauh lebih cepat daripada loop Python murni. Mari kita buktikan dengan benchmark sederhana.

python
import time
import numpy as np

n = 1_000_000

# Pendekatan Python biasa (list comprehension)
data = list(range(n))
start = time.time()
hasil = [x * 2 + 1 for x in data]
print(f"Python loop: {time.time() - start:.4f} detik")

# Pendekatan NumPy (vektor)
arr = np.arange(n)
start = time.time()
hasil_np = arr * 2 + 1
print(f"NumPy vektor: {time.time() - start:.4f} detik")

Agregasi: sum, mean, min, max, dan Axis

NumPy menyediakan fungsi agregasi bawaan untuk meringkas data. Untuk array multidimensi, kamu bisa menentukan sumbu (axis) agregasinya: axis=0 berarti per kolom, axis=1 berarti per baris.

python
a = np.array([[1, 2, 3], [4, 5, 6]])

print(a.sum())        # 21
print(a.mean())       # 3.5
print(a.min())        # 1
print(a.max())        # 6
print(a.std())        # standar deviasi

# Agregasi per sumbu
print(a.sum(axis=0))  # [5 7 9]   (jumlah tiap kolom)
print(a.sum(axis=1))  # [6 15]    (jumlah tiap baris)

Boolean Masking: Filter Data dengan Kondisi

Boolean masking adalah teknik memfilter elemen array menggunakan kondisi logika. Ini sangat berguna saat membersihkan atau memilih subset data.

python
a = np.arange(10)

mask = a > 4
print(mask)           # [False False False False False True ...]
print(a[mask])        # [5 6 7 8 9]
print(a[a % 2 == 0])  # [0 2 4 6 8]  (bilangan genap)

# Gabungkan kondisi dengan & dan |
b = a[(a > 2) & (a < 8)]
print(b)              # [3 4 5 6 7]

Fungsi Matematika dan Aljabar Linear

NumPy punya banyak fungsi matematika (universal functions atau ufunc) yang bekerja elemen per elemen, plus modul np.linalg untuk operasi aljabar linear seperti invers dan determinan matriks.

python
a = np.array([0, np.pi/2, np.pi])
print(np.sin(a))
print(np.exp([0, 1, 2]))

# Aljabar linear
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])

print(A @ B)            # perkalian matriks (Python 3.5+)
print(np.dot(A, B))     # sama dengan A @ B
print(np.linalg.inv(A)) # invers matriks
print(np.linalg.det(A)) # determinan

Simpan dan Muat Array ke File

Array NumPy bisa disimpan ke file biner (.npy) yang sangat cepat untuk dibaca kembali, atau ke format teks seperti CSV untuk pertukaran data.

python
arr = np.arange(100)

# Format biner NumPy (cepat, preservasi tipe data)
np.save("data.npy", arr)
loaded = np.load("data.npy")
print(loaded)

# Format teks (CSV)
np.savetxt("data.csv", arr, delimiter=",")
loaded_csv = np.loadtxt("data.csv", delimiter=",")
print(loaded_csv)

Langkah Selanjutnya

Selamat! Kamu sekarang memahami fondasi NumPy: membuat array, indexing, broadcasting, agregasi, hingga aljabar linear. Dari sini, kamu bisa mulai mengolah dataset nyata dengan Pandas untuk analisis data, memvisualisasikan hasilnya lewat Matplotlib, atau melangkah ke machine learning. Semuanya memakai array NumPy sebagai fondasi yang sama.

NumPy adalah gerbang menuju data science di Python. Kuasai array, slicing, dan broadcasting dengan latihan rutin — begitu lancar, kamu akan menyadari betapa banyak library populer yang sebenarnya "hanya" lapisan tipis di atas NumPy.

Apakah NumPy benar-benar lebih cepat daripada list Python biasa?

Ya, untuk operasi numerik pada data berukuran besar. NumPy mengimplementasikan operasinya dalam C yang terkompilasi dan menyimpan data secara berurutan di memori, sehingga operasi vektor bisa puluhan hingga ratusan kali lebih cepat daripada loop Python murni.

Apa perbedaan antara NumPy dan Pandas?

NumPy fokus pada array numerik multidimensi yang homogen dan komputasi matematis. Pandas dibangun di atas NumPy dan menyediakan struktur data berlabel (Series dan DataFrame) yang lebih cocok untuk data tabular seperti tabel, CSV, dan dataset dengan kolom bertipe campuran.

Apakah saya harus belajar NumPy sebelum Pandas atau Scikit-learn?

Sangat disarankan. Pandas dan Scikit-learn menggunakan array NumPy sebagai struktur data dasarnya. Memahami array, indexing, dan broadcasting akan membuatmu jauh lebih mudah memahami dan men-debug kedua library tersebut.