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:

create numpy array

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])

create numpy array 2

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)

numpy_arrays_example_1

Untuk melakukan operasi penjumlahan pada tiap barisnya, kita bisa menggunakan operator +:

data + ones
array([2., 3.])

numpy_arrays_adding_1

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.])

numpy_array_subtract_multiply_divide

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_array_broadcast

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])

numpy_array_slice

Aggregation#

Benefit lain dari NumPy adalah fungsi-fungsi untuk agregasi data:

data.max()
2
data.min()
1
data.sum()
3

numpy_array_aggregation

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]])

numpy_array_create_2d

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]])

numpy_matrix_ones_zeros_random

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.]])

numpy_matrix_arithmetic

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.]])

numpy_matrix_broadcast

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])

numpy_matrix_dot_product_1

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:

numpy_matrix_dot_product_2

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])

numpy_matrix_indexing

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

numpy_matrix_aggregation_1

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])

numpy_matrix_aggregation_4

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]])

numpy_transpose

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]])

numpy_reshape

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]]])

numpy_3d_array

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]]])

numpy_3d_array_creation

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:

mean_square_error_formula

Di NumPy, kita bisa menulisnya seperti ini:

numpy_mean_square_error_formula

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:

numpy_mse_1

Kedua array predictions dan labels memiliki 3 elemen, yang berarti nilai variabel n juga 3. Setelah kita melakukan operasi pengurangan, hasil sementara adalah berikut:

numpy_mse_2

Selanjutnya, hasil dari pemangkatan adalah:

numpy_mse_3

Dan hasil penjumlahannya:

numpy_mse_4

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.

excel_top_pandas

Audio and Timeseries#

File audio adalah array 1 dimensi dimana elemennya berupa sampel angka yang merepresentasikan sinyal audio.

numpy_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:

numpy_grayscale_image

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:

numpy_color_image