Visual Introduction to NumPy#
Pada notebook ini, kita akan melihat beberapa cara menggunakan NumPy dan bagaimana NumPy mampu merepresentasikan tipe data-tipe data (tabel, gambar, teks, dll).
import numpy as np
Creating Arrays#
Kita bisa membuat sebuah NumPy array (alias ndarray
) dengan menggunakan method np.array()
dan memberikan Python list sebagai parameter input.
np.array([1, 2, 3])
array([1, 2, 3])
Python akan membuat NumPy array seperti gambar di bawah:
Sering kali, kita akan menggunakan NumPy untuk meng-inisialisasi nilai dari array. NumPy memiliki methods seperti ones()
, zeros()
, dan random.random()
untuk membantu kita. Kita cukup memberi nilai untuk element-element yang mau dibuat:
np.ones(3)
array([1., 1., 1.])
np.zeros(3)
array([0., 0., 0.])
np.random.random(3)
array([0.72460707, 0.85334514, 0.06176135])
Setelah kita membuat NumPy array, kita bisa mulai memanipulasi mereka.
Array Arithmetic#
Ayo kita buat 2 NumPy arrays untuk mendemonstrasikan bagaimana menggunakan mereka. Kita beri nama data
dan ones
:
data = np.array([1, 2])
ones = np.ones(2)
Untuk melakukan operasi penjumlahan pada tiap barisnya, kita bisa menggunakan operator +
:
data + ones
array([2., 3.])
Ini adalah salah satu keunggulan dalam menggunakan NumPy, dimana kompleksitas dalam melakukan penjumlahan dua array / list, telah diabstraksi ke level yang lebih tinggi. Bisa kalian bayangkan bagaimana melakukan operasi penjumlahan dua list menggunakan vanilla Python?
Dan bukan hanya penjumlahan yang bisa NumPy lakukan:
data - ones
array([0., 1.])
data * data
array([1, 4])
data / data
array([1., 1.])
Kita juga bisa melakukan operasi antara array dan angka (atau biasa disebut operasi antara vector dan skalar). Misalnya, kita punya array yang merepresentasikan jarak dalam miles dan kita mau mengkonversi ke km. Kita bisa melakukannya seperti ini data * 1.6
:
data * 1.6
array([1.6, 3.2])
NumPy secara otomatis melakukan operasi perkalian pada setiap baris. Konsep ini dinamakan broadcasting.
Indexing#
Kita juga bisa meng-index dan memotong (slice) NumPy arrays seperti di Python list:
data
array([1, 2])
data[0]
1
data[1]
2
data[0:2]
array([1, 2])
data[1:]
array([2])
Aggregation#
Benefit lain dari NumPy adalah fungsi-fungsi untuk agregasi data:
data.max()
2
data.min()
1
data.sum()
3
Selain min()
, max()
, dan sum()
, kamu juga bisa menggunakan mean()
untuk mendapatkan nilai rata-rata, prod()
untuk hasil perkalian semua elemen, std()
untuk standar deviasi, dan lebih banyak lagi.
In more dimensions#
Sampai sini, kita melakukan operasi pada vector satu dimensi. Salah satu kelebihan NumPy adalah melakukan semua operasi yang sudah lihat di atas pada array dengan dimensi berapapun.
Creating Matrices#
Untuk membuat matrix, kita bisa memberikan lists of lists:
np.array([[1, 2], [3, 4]])
array([[1, 2],
[3, 4]])
Kita juga bisa menggunakan methods di atas (ones()
, zeros()
, dan random.random()
) untuk membuat matriks, asalkan kita memberikan tuple yang mendeskripsikan dimensi matrix yang mau kita buat:
np.ones((3, 2))
array([[1., 1.],
[1., 1.],
[1., 1.]])
np.zeros((3, 2))
array([[0., 0.],
[0., 0.],
[0., 0.]])
np.random.random((3, 2))
array([[0.4087331 , 0.43415853],
[0.25579427, 0.27746966],
[0.29308408, 0.70499797]])
Matrix Arithmetic#
Kita bisa melakukan operasi aritmatika pada matriks (+-*/
) asalkan kedua matriksnya memiliki ukuran yang sama. NumPy akan menganggapnya sebagai operasi position-wise:
data = np.array([[1, 2], [3, 4]])
ones = np.ones((2, 2))
data + ones
array([[2., 3.],
[4., 5.]])
Kita juga bisa melakukan operasi aritmatika dengan matriks yang berukuran beda asalkan dimensinya satu (matriksnya hanya punya satu kolom atau satu baris). NumPy akan melakukan broadcasting secara otomatis:
data = np.array([[1, 2], [3, 4], [5, 6]])
ones_row = np.ones(2)
data + ones_row
array([[2., 3.],
[4., 5.],
[6., 7.]])
Dot Product#
Untuk melakukan operasi perkalian pada matriks, kita harus menggunakan method dot()
.
data = np.array([1, 2, 3])
powers_of_ten = np.array([[1, 10], [100, 1000], [10000, 100000]])
data.dot(powers_of_ten)
array([ 30201, 302010])
Perlu diingat bahwa perkalian matriks mewajibkan agar kedua matriks memiliki dimensi kolom dan baris yang sama. Kamu juga bisa memvisualisasikan operasi di atas seperti berikut:
Matrix Indexing#
Indexing dan slicing pada NumPy akan sangat berguna untuk memanipulasi matriks:
data = np.array([[1, 2], [3, 4], [5, 6]])
data
array([[1, 2],
[3, 4],
[5, 6]])
data[0, 1]
2
data[1:3]
array([[3, 4],
[5, 6]])
data[0:2, 0]
array([1, 3])
Matrix Aggregation#
Kita bisa mengagregat matrix sebagaimana kita mengagregat vector:
data = np.array([[1, 2], [3, 4], [5, 6]])
data
array([[1, 2],
[3, 4],
[5, 6]])
data.max()
6
data.min()
1
data.sum()
21
Selain dapat melakukan agregat pada semua elemen di matrix, kita juga bisa melakukan agregat pada baris atau kolom dengan menggunakan parameter axis
:
data = np.array([[1, 2], [5, 3], [4, 6]])
data
array([[1, 2],
[5, 3],
[4, 6]])
data.max(axis=0)
array([5, 6])
data.max(axis=1)
array([2, 5, 6])
Transpose and Reshape#
Salah satu operasi yang sering dilakukan pada matrix adalah transpose, terutama saat kita ingin mendapatkan dot product dari dua matriks dan kita perlu menyamakan dimensinya. NumPy array memiliki properti T
yang sangat berguna untuk mendapatkan hasil transpose dari matriks:
data = np.array([[1, 2], [3, 4], [5, 6]])
data
array([[1, 2],
[3, 4],
[5, 6]])
data.T
array([[1, 3, 5],
[2, 4, 6]])
Untuk kasus yang lebih kompleks, kamu mungkin perlu mengubah dimensi dari suatu matrix. Hal ini akan sering kamu temukan pada aplikasi machine learning ketika suatu model mengharapkan input dengan dimensi yang berbeda dari dataset kamu. NumPy memiliki method reshape()
yang berguna untuk kasus ini. Kamu bisa memberikan dimensi baru yang kamu inginkan.
data = np.array([1, 2, 3, 4, 5, 6])
data
array([1, 2, 3, 4, 5, 6])
data.reshape(2, 3)
array([[1, 2, 3],
[4, 5, 6]])
data.reshape(3, 2)
array([[1, 2],
[3, 4],
[5, 6]])
Yet More Dimensions#
Semua hal yang telah kita bahas di atas, bisa NumPy terapkan pada array dalam dimensi berapapun.
np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
array([[[1, 2],
[3, 4]],
[[5, 6],
[7, 8]]])
Untuk menambahkan dimensi baru, kamu cukup menambahkan tanda koma dan nilai dimensinya sebagai parameter input pada fungsi-fungsi NumPy:
np.ones((4, 3, 2))
array([[[1., 1.],
[1., 1.],
[1., 1.]],
[[1., 1.],
[1., 1.],
[1., 1.]],
[[1., 1.],
[1., 1.],
[1., 1.]],
[[1., 1.],
[1., 1.],
[1., 1.]]])
np.zeros((4, 3, 2))
array([[[0., 0.],
[0., 0.],
[0., 0.]],
[[0., 0.],
[0., 0.],
[0., 0.]],
[[0., 0.],
[0., 0.],
[0., 0.]],
[[0., 0.],
[0., 0.],
[0., 0.]]])
np.random.random((4, 3, 2))
array([[[0.90498395, 0.03851184],
[0.21415917, 0.95431541],
[0.85389651, 0.58808646]],
[[0.49770434, 0.75591488],
[0.91092166, 0.589791 ],
[0.15598801, 0.34621563]],
[[0.59502785, 0.91617785],
[0.32737737, 0.0324181 ],
[0.49116377, 0.8892512 ]],
[[0.19408499, 0.9912059 ],
[0.0789867 , 0.6225484 ],
[0.56906944, 0.50474263]]])
Practical Usage#
Sekarang kita akan melihat contoh-contoh penggunaan NumPy.
Formulas#
Untuk mengimplementasikan rumus matematika pada matriks dan vector adalah salah satu alasan untuk menggunakan NumPy.
NumPy dapat mengimplementasikan rumus-rumus matematika pada data matriks dan vector dengan mudah – ini menjadi salah satu alasan kenapa NumPy banyak digemari oleh komunitas Python. Contohnya, perhatikan rumus mean squared error (kuadrat dari rata-rata kesalahan) yang sering digunakan pada supervised ML models terutama untuk regression:
Di NumPy, kita bisa menulisnya seperti ini:
predictions = np.array([1, 1, 1])
labels = np.array([1, 2, 3])
error = (1 / predictions.size) * np.sum(np.square(predictions - labels))
error
1.6666666666666665
Kelebihan dari kode di atas adalah kita tidak perlu khawatir terhadap ukuran array predictions
dan labels
, apakah ukuran mereka hanya 1 atau ribuan elemen, asalakan mereka memiliki ukuran yang sama.
Marilah kita lihat langkah-langkah dari 4 operasi matematika rumus MSE di atas:
Kedua array predictions
dan labels
memiliki 3 elemen, yang berarti nilai variabel n
juga 3. Setelah kita melakukan operasi pengurangan, hasil sementara adalah berikut:
Selanjutnya, hasil dari pemangkatan adalah:
Dan hasil penjumlahannya:
Akhirnya, kita mendapatkan nilai error dari prediksi model yang merupakan nilai kualitas dari model.
Data Representation#
Bayangkan semua tipe data yang perlu kamu proses untuk membuat model machine learning, bisa jadi data tersebut adalah spreadsheets, images, audio, dll. Tipe data-tipe data tersebut sangat cocok untuk direpresentaikan dalam n-dimensional array.
Tables and Spreadsheets#
Spreadsheet atau tabel merupakan matriks 2 dimensi. Library Python yang paling populer untuk bekerja dengan tabel adalah Pandas yang dibuat menggunakan NumPy.
Audio and Timeseries#
File audio adalah array 1 dimensi dimana elemennya berupa sampel angka yang merepresentasikan sinyal audio.
Images#
Gambar adalah matriks yang biasa diukur dalam bentuk pixel (panjang x lebar).
Jika gambarnya hanya berupa hitam dan putih, setiap pixel bisa direpresentasikan dalam satu nilai (biasanya antara 0 (hitam) dan 255 (putih)). Berikut contoh representasi gambar hitam putih:
Namun, jika gambarnya berwarna, setiap pixel direpresentasikan oleh 3 nilai - dimana setiap nilainya untuk warna merah, hijau, dan biru. Karena itu kita perlu 3 dimensi untuk gambar berwarna karena setiap cell hanya bisa menyimpan satu warna: