Esensial NumPy

Array NumPy, vektorisasi, dan konsep axis sebagai fondasi pandas.

Daftar isi

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.

python numpy_esensial.py
"""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
text Keluaran
[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=0 per kolom dan axis=1 per baris, dan uji panjang hasil mengecek arahnya.
  • pandas berdiri di atas NumPy, dan konversi di antara keduanya murah dan wajar dilakukan.

Referensi#