Topik ini memperkenalkan NumPy sebagai pustaka array untuk komputasi numerik di Python. Pembahasan mencakup definisi NumPy, objek ndarray sebagai intinya, operasi tervektorisasi, kedudukan NumPy di bawah pustaka sains data lain, serta perbandingan konseptual antara list dan array. Setelah membacanya, istilah array, ndarray, dtype, dan vektorisasi dapat dipakai dengan tepat, dan contoh kode pertama dapat dibaca dengan pemahaman penuh.
Pustaka array untuk komputasi numerik#
NumPy adalah pustaka (library) Python open source untuk komputasi numerik, dan namanya merupakan singkatan dari Numerical Python. Pusat pustaka ini adalah objek array berdimensi bebas yang disebut ndarray, yaitu wadah deret nilai dengan tipe yang seragam. Di atas fondasi tersebut, NumPy menyediakan ratusan fungsi matematika, logika, dan aljabar yang bekerja pada seluruh elemen array sekaligus. Bagian yang menentukan kecepatannya ditulis dalam C, sehingga hasil komputasinya tidak bergantung pada laju interpreter Python.
Kode berikut membuat satu array suhu udara berisi lima elemen, lalu menaikkan seluruh nilainya dan menghitung rata-ratanya. Perhatikan bahwa tidak ada satu pun perulangan yang ditulis.
import numpy as np
suhu = np.array([27.5, 28.0, 26.5, 27.0, 28.5])
print(suhu)
print(suhu + 0.5)
print(suhu.mean())[27.5 28. 26.5 27. 28.5]
[28. 28.5 27. 27.5 29. ]
27.5Setiap pernyataan mencetak satu baris. Pernyataan suhu + 0.5 menambahkan nilai 0.5 pada setiap elemen dalam satu langkah, sedangkan metode mean() merangkum seluruh array menjadi satu angka rata-rata. Tanda titik pada 0.5 adalah sintaks Python untuk bilangan pecahan, dan konvensi ini berlaku pada seluruh kode jalur ini. Pola yang tampak di sini, yaitu operasi dinyatakan sekali lalu diterapkan pada seluruh data, menjadi model utama sepanjang materi NumPy.
Objek ndarray#
Secara teknis, ndarray adalah objek array berdimensi bebas (N-dimensional array), yaitu wadah nilai dengan satu tipe data (dtype) dan satu bentuk (shape) yang berlaku tetap. Tipe data menyatakan jenis anggota array, misalnya bilangan pecahan berukuran 64 bit, sedangkan bentuk menyatakan ukuran pada setiap dimensinya. Kedua sifat ini mengikat seluruh elemen sekaligus, sehingga satu array tidak boleh berisi campuran tipe yang berbeda.
Kedua atribut tersebut dapat diperiksa langsung pada array yang baru dibuat.
import numpy as np
suhu = np.array([27.5, 28.0, 26.5, 27.0, 28.5])
print(suhu.dtype)
print(suhu.shape)float64
(5,)Atribut dtype melaporkan float64, yaitu tipe pecahan berukuran 64 bit yang dipilih NumPy karena anggota array berupa pecahan. Atribut shape melaporkan (5,), yang dibaca sebagai satu dimensi berisi lima elemen. Kebiasaan memeriksa tipe dan bentuk seperti ini sangat berguna, karena kebanyakan error NumPy bermula dari tipe atau bentuk yang tidak sesuai dugaan.
Bentuk tidak berhenti pada satu dimensi. Array dua dimensi misalnya melaporkan shape seperti (3, 4), yang dibaca tiga baris berisi empat elemen, dan dimensi yang lebih dalam mengikuti pola yang sama. Karena tipe dan bentuk diketahui sejak awal, NumPy dapat menghitung posisi setiap elemen secara aritmetis tanpa memeriksa objek satu per satu. Sifat inilah yang membedakan ndarray dari list bersarang, yaitu list yang anggotanya berupa list, meskipun keduanya tampak serupa saat dicetak.
Operasi tervektorisasi#
Vektorisasi (vectorization) adalah gaya menulis operasi untuk seluruh array dalam satu pernyataan, tanpa perulangan eksplisit. Operator Python yang sudah dikenal, seperti *, +, dan >, memperoleh makna baru ketika salah satu operandnya adalah array. Perilaku berikut memperlihatkan perbedaannya terhadap list, yaitu struktur data bawaan Python yang dapat menampung nilai campuran.
import numpy as np
daftar = [1, 2, 3]
array = np.array([1, 2, 3])
print(daftar * 2)
print(array * 2)
print(array > 2)[1, 2, 3, 1, 2, 3]
[2 4 6]
[False False True]Pada list, operator * mengulang isinya sehingga hasilnya memuat anggota yang sama dua kali. Pada array, operator yang sama mengalikan setiap elemen, dan perbandingan array > 2 menghasilkan array boolean, sesuatu yang tidak dimiliki list. Perhitungan per elemen ini dijalankan oleh perulangan yang ditulis dalam C, sehingga pemeriksaan tipe per elemen yang biasa dilakukan interpreter tidak pernah terjadi. Istilah “operasi secepat C” berasal dari sini, dengan catatan bahwa kecepatan aktualnya bergantung pada ukuran data dan perangkat keras.
Array boolean yang dihasilkan perbandingan juga bukan sekadar keluaran yang menarik. Nilai per elemen tersebut menjadi bahan penyaringan data di NumPy, yaitu mengambil hanya elemen yang memenuhi kondisi tertentu. Untuk saat ini, cukup dicatat bahwa satu perbandingan memberi satu jawaban untuk setiap elemen, bukan satu jawaban untuk seluruh array.
Fondasi ekosistem sains data#
Kedudukan NumPy mudah dipahami dari posisinya di bawah pustaka lain. pandas menyimpan kolom datanya sebagai ndarray, scikit-learn menerima ndarray sebagai masukan untuk melatih model, dan SciPy menyusun algoritma ilmiahnya di atas array NumPy. PyTorch memakai struktur data bernama tensor dan menyediakan jalur konversi dua arah antara tensor dan ndarray, sehingga data yang disiapkan dengan NumPy dapat langsung dipakai pada pustaka pembelajaran mesin tersebut. Semuanya berpijak pada ndarray, baik secara langsung maupun melalui padanan yang dapat dikonversi dua arah dengannya.
Contoh berikut menggunakan pandas untuk membuktikan hubungan tersebut. Kolom dibuat dari array NumPy, lalu tipe data di baliknya diperiksa.
import numpy as np
import pandas as pd
suhu = np.array([27.5, 28.0, 26.5, 27.0, 28.5])
kolom = pd.Series(suhu)
print(type(kolom.values))
print(kolom.values + 1.0)<class 'numpy.ndarray'>
[28.5 29. 27.5 28. 29.5]Tipe yang tercetak adalah numpy.ndarray, bukan tipe khusus milik pandas. Dengan demikian, operasi NumPy seperti penambahan 1.0 dapat langsung diterapkan pada data yang tampak sebagai milik pandas. Diagram berikut merangkum kedudukan tersebut.
Lapisan paling atas berisi pustaka yang paling sering disentuh sehari-hari, sedangkan ndarray berada tepat di bawahnya sebagai bahasa bersama. Lapisan paling bawah adalah kode C teroptimasi dan BLAS (Basic Linear Algebra Subprograms), yaitu kumpulan rutinitas aljabar linear yang teruji secara luas. Pengguna berinteraksi dengan lapisan atas, tetapi keterampilan yang paling sering dipakai adalah mengelola ndarray di lapisan tengah.
List dan array pada level konsep#
Dalam Python, list adalah struktur data serbaguna untuk kegunaan umum, sedangkan ndarray dirancang khusus untuk data numerik. Perbedaannya dapat diringkas pada tabel berikut.
| Aspek | list Python | ndarray NumPy |
|---|---|---|
| Tipe elemen | bebas campur antar anggota | satu dtype untuk semua elemen |
| Tata letak memori | penunjuk ke objek yang tersebar | angka mentah yang berdampingan |
| Aritmetika per elemen | tidak tersedia secara langsung | tersedia melalui operator |
| Biaya memori per angka | tinggi karena pembungkus objek | rendah karena angka mentah |
| Peran utama | struktur data serbaguna | komputasi numerik |
Aturan praktisnya, list dipilih untuk data campuran yang ukurannya kecil dan strukturnya sering berubah, sedangkan array dipilih untuk data numerik yang seragam dan berukuran besar. Tabel di atas menyandingkan keduanya pada level konsep, yaitu cara data disimpan dan cara operator memaknainya, bukan hasil pengukuran kecepatan. Pengukuran kecepatan memerlukan metode tersendiri dan tidak termasuk lingkup topik ini.
Kesalahan umum#
Dua kesalahan berikut paling sering muncul pada tahap perkenalan. Keduanya tidak merusak berkas apa pun, tetapi satu di antaranya menghasilkan pesan error yang membingungkan, sedangkan yang lain menghasilkan data yang tidak dapat dihitung. Mengenali polanya sejak awal menghemat waktu pencarian penyebab.
Memanggil fungsi array tanpa menyebut modulnya#
Setelah impor, fungsi array tidak tersedia sebagai nama bebas. Fungsi tersebut adalah anggota modul numpy, sehingga pemanggilannya selalu melalui nama modul atau alias yang dideklarasikan.
import numpy as np
try:
array([1, 2, 3])
except NameError as e:
print(f"NameError: {e}")NameError: name 'array' is not definedPesan NameError muncul karena Python tidak mengenal nama array. Perbaikannya adalah memanggil np.array([1, 2, 3]), dan kebiasaan ini sekaligus menjaga kode selaras dengan dokumentasi resmi.
Mencampur tipe di dalam satu array#
Homogenitas tipe dipaksakan pada saat array dibuat. Apabila anggotanya campur, NumPy memilih satu tipe yang mencakup semuanya, dan pilihan itu dapat mengejutkan.
import numpy as np
campur = np.array([1, 2.5, "tiga"])
print(campur)
print(campur.dtype)['1' '2.5' 'tiga']
<U32Seluruh anggota dikonversi menjadi teks karena salah satu anggotanya berupa string, dan <U32 pada dtype melaporkan tipe string Unicode tersebut. Nilai 1 dan 2.5 ikut berubah menjadi teks, sehingga perhitungan atas keduanya tidak mungkin dilakukan. Perbaikannya adalah menyimpan angka sebagai angka, dan menandai bagian data yang kosong dengan np.nan bila memang diperlukan.
Ringkasan#
- NumPy adalah pustaka array untuk komputasi numerik, dan objek intinya adalah ndarray dengan satu dtype serta satu shape untuk seluruh elemen.
- Operasi tervektorisasi dinyatakan sekali untuk seluruh array dan dijalankan oleh perulangan C, bukan oleh interpreter Python.
- Keterampilan NumPy berlaku langsung pada pandas, scikit-learn, dan SciPy karena semuanya menyimpan atau mengonsumsi ndarray.
- Struktur list bersifat serbaguna untuk data campuran, sedangkan array dipilih untuk data numerik yang seragam dan berukuran besar.
Referensi#
- What is NumPy? — NumPy — Definisi resmi NumPy beserta penjelasan ndarray dan kedudukannya di ekosistem Python.
- NumPy: the absolute basics for beginners — NumPy — Tutorial resmi pertama yang memperkenalkan array, dtype, dan operasi dasarnya.
- NumPy reference — NumPy — Rujukan lengkap fungsi dan objek NumPy untuk pendalaman di luar topik ini.