NumPy adalah lapisan perhitungan numerik di bawah hampir semua pustaka data Python, dan esensialnya tiga hal, yaitu array sebagai wadah data yang seragam, vektorisasi sebagai cara mengoperasikannya tanpa perulangan eksplisit, serta axis sebagai arah agregasi. Topik ini membangun ketiganya secara berurutan pada data pengukuran kecil. Setelah membacanya, perilaku pandas yang terasa ajaib pada modul berikutnya dapat dijelaskan sebagai operasi NumPy.
Array: wadah seragam yang cepat#
Array NumPy menyimpan banyak angka dengan tipe yang sama dalam satu blok memori, berbeda dengan daftar Python yang menyimpan setiap elemen sebagai objek terpisah. Keseragaman inilah sumber kecepatannya, karena operasi dapat dikerjakan satu kali atas seluruh blok oleh kode yang ditulis dalam bahasa terkompilasi.
Pembuatan array paling umum adalah dari daftar dengan np.array, atau dari
pola bawaan seperti np.zeros, np.arange, dan np.linspace. Setiap array
membawa shape yang menyatakan jumlah baris dan kolomnya, serta dtype yang
menyatakan tipe elemennya, dan kedua atribut ini yang pertama diperiksa
apabila hasil operasi terasa aneh.
Satu perbedaan yang sering mengejutkan adalah operasi pada array tidak mengubah array aslinya, melainkan menghasilkan array baru. Pola tanpa efek samping ini memudahkan penelusuran, karena keadaan data pada satu langkah tidak berubah diam-diam oleh langkah berikutnya.
Vektorisasi: tanpa perulangan eksplisit#
Vektorisasi berarti menerapkan operasi ke seluruh array sekaligus, dan hasilnya dua sisi yang sama-sama penting, yaitu kode yang lebih pendek dan eksekusi yang lebih cepat. Skrip berikut memperlihatkan bentuknya pada konversi suhu serta agregasi dan penyaringan matriks kecil pengukuran udara.
"""Fondasi NumPy: array, vektorisasi, dan axis."""
import numpy as np
suhu = np.array([30.1, 29.4, 31.8, 28.9, 30.6])
print(suhu * 9 / 5 + 32) # vektorisasi tanpa perulangan
print(suhu.mean().round(2), suhu.std().round(2))
matriks = np.array([[34.0, 71.0],
[41.5, 68.0],
[28.0, 75.0]]) # baris = waktu, kolom = pm25, kelembapan
print(matriks.mean(axis=0).round(1)) # rata-rata per kolom
print(matriks.mean(axis=1).round(1)) # rata-rata per baris
print(matriks[matriks[:, 0] > 30][:, 0]) # mask boolean pada kolom pertama[86.18 84.92 89.24 84.02 87.08]
30.16 1.01
[34.5 71.3]
[52.5 54.8 51.5]
[34. 41.5]Ekspresi suhu * 9 / 5 + 32 mengalikan seluruh array dengan 9, membagi dengan
5, lalu menambah 32, tanpa satu pun perulangan yang ditulis. Keluaran
terakhir memperlihatkan mask boolean, yaitu membandingkan seluruh kolom dengan
30 untuk menghasilkan array benar salah, lalu memakainya sebagai pemilih
baris. Pola yang sama akan menjadi penyaringan pandas pada modul berikutnya.
Axis: arah agregasi#
Axis menyatakan arah yang dilintasi saat agregasi, dan kebingungannya adalah
jebakan klasik pemula. Aturan yang menolong adalah axis merujuk pada arah yang
dilipat (collapsed). axis=0 melipat baris sehingga hasilnya satu nilai per
kolom, sedangkan axis=1 melipat kolom sehingga hasilnya satu nilai per
baris.
Pada keluaran di atas, axis=0 menghasilkan [34.5 71.3], yaitu rata-rata
kolom pm25 dan kolom kelembapan, sedangkan axis=1 menghasilkan satu rata-rata
untuk setiap baris pengukuran. Uji cepatnya adalah melihat panjang hasil, yaitu
tiga baris memberi tiga nilai pada axis=1, sedangkan dua kolom memberi dua
nilai pada axis=0.
Konsep yang sama dibawa pandas secara langsung, misalnya
df.mean(axis=0) menghitung per kolom dan df.mean(axis=1) per baris, dan
groupby pada modul pengelompokan pada dasarnya adalah pemilihan axis yang
dikelompokkan menurut nilai kuncinya.
Kapan array dan kapan tabel#
NumPy bukan pengganti pandas, melainkan fondasinya. Array unggul ketika data homogen dan perhitungannya matematis, misalnya transformasi kolom angka, sampling, atau simulasi. Tabel pandas unggul ketika kolomnya campur tipe, diberi nama, dan berisi data hilang, yang merupakan keadaan normal data nyata.
Kebiasaan yang sehat adalah mengerjakan sebagian besar analisis pada pandas,
lalu turun ke NumPy ketika operasi yang dibutuhkan tidak tersedia di sana.
Konversinya murah, yaitu df["pm25"].to_numpy() dan
pd.DataFrame(array), dan mengetahui lapisan di bawahnya membuat pesan error
pandas terbaca jauh lebih mudah.
Kesalahan umum#
Kesalahan pertama adalah menulis perulangan for atas array untuk operasi yang
sebenarnya tervektorisasi. Kode tersebut tetap benar tetapi lambat pada data
besar, dan bentuknya yang panjang menyembunyikan maksud perhitungannya.
Kesalahan kedua adalah tertukar axis saat agregasi. Hasil axis=0 pada tabel
transpos akan persis seperti axis=1 pada tabel aslinya, sehingga angka yang
salah arah bisa terlihat wajar. Uji panjang hasil terhadap jumlah baris atau
kolom adalah pemeriksaan yang murah.
Kesalahan ketiga adalah mengabaikan dtype. Pembagian bilangan bulat, nilai
nan yang muncul dari tipe yang salah, atau penumpukan string di atas array
numerik menghasilkan error atau keanehan yang sulit dilacak, sedangkan
pemeriksaan dtype di awal menutupnya seketika.
Ringkasan#
- Array NumPy menyimpan data seragam dalam satu blok memori sehingga operasi berjalan cepat dan tanpa efek samping.
- Vektorisasi menggantikan perulangan eksplisit dengan ekspresi satu baris, termasuk mask boolean sebagai pemilih baris.
- Axis menyatakan arah yang dilipat, yaitu
axis=0per kolom danaxis=1per baris, dan uji panjang hasil mengecek arahnya. - pandas berdiri di atas NumPy, dan konversi di antara keduanya murah dan wajar dilakukan.
Referensi#
- NumPy: the absolute basics for beginners — NumPy documentation — pengantar resmi array, vektorisasi, dan axis.
- NumPy fundamentals — NumPy documentation
—
rujukan resmi
shape,dtype, dan penyalinan array.