Operasi Aritmatika & Broadcasting
Setelah mempelajari cara membuat array, mengenal atribut array, serta melakukan indexing dan slicing, langkah berikutnya adalah memanipulasi dan melakukan operasi matematika pada NumPy array.
Operasi aritmatika pada array merupakan salah satu kemampuan penting dalam Data Science dan Machine Learning, karena sebagian besar data yang digunakan dalam proses komputasi akan direpresentasikan dalam bentuk angka.
NumPy memungkinkan operasi matematika dilakukan secara efisien pada seluruh elemen array tanpa harus menuliskan perulangan secara manual.
Salah satu konsep penting yang akan dipelajari adalah element-wise operation, yaitu operasi yang dilakukan pada setiap elemen array berdasarkan posisinya.
Element-Wise Operation
Element-wise operation berarti operasi dilakukan terhadap elemen-elemen array secara berpasangan berdasarkan posisi atau indeksnya.
Sebagai contoh, terdapat dua array:
import numpy as np
A1 = np.array([1, 2, 3])
ones = np.ones(3)
print(A1)
print(ones)
Output:
[1 2 3]
[1. 1. 1.]
Ketika kedua array dijumlahkan:
A1 + ones
NumPy akan melakukan operasi:
1 + 1 = 2
2 + 1 = 3
3 + 1 = 4
Sehingga hasilnya:
[2. 3. 4.]
Operasi tersebut disebut element-wise addition.
Penjumlahan Array
Penjumlahan dapat dilakukan menggunakan operator +.
A1 = np.array([1, 2, 3])
ones = np.ones(3)
print(A1 + ones)
Output:
[2. 3. 4.]
NumPy juga menyediakan fungsi np.add() untuk melakukan operasi yang sama.
print(np.add(A1, ones))
Output:
[2. 3. 4.]
Keduanya menghasilkan nilai yang sama.
Operator vs Fungsi NumPy
Secara umum:
A1 + ones
dan:
np.add(A1, ones)
memiliki tujuan yang sama.
Operator biasanya lebih singkat dan mudah dibaca, sedangkan fungsi NumPy berguna ketika ingin menggunakan operasi tersebut sebagai bagian dari fungsi atau workflow NumPy yang lebih kompleks.
Pengurangan Array
Pengurangan dilakukan menggunakan operator -.
print(A1 - ones)
Output:
[0. 1. 2.]
Operasi tersebut secara konsep adalah:
1 - 1 = 0
2 - 1 = 1
3 - 1 = 2
Sehingga:
[0. 1. 2.]
Perkalian Array
Perkalian menggunakan operator *.
print(A1 * ones)
Output:
[1. 2. 3.]
Operasinya dilakukan secara element-wise:
1 × 1 = 1
2 × 1 = 2
3 × 1 = 3
Perlu diperhatikan bahwa * pada NumPy array merupakan element-wise multiplication, bukan perkalian matriks.
Perkalian matriks memiliki konsep dan operator yang berbeda, yang akan dipelajari pada materi berikutnya jika diperlukan.
Pembagian Array
NumPy juga mendukung pembagian menggunakan operator /.
Contohnya:
A1 = np.array([1, 2, 3])
A2 = np.array([
[1., 2., 3.3],
[4., 5., 6.5]
])
print(A2 / A1)
Pada contoh tersebut, NumPy menggunakan broadcasting agar array A1 dapat digunakan dalam operasi terhadap A2.
Hasilnya:
[[1. 1. 1.1 ]
[4. 2.5 2.16666667]]
Floor Division
Selain pembagian standar menggunakan /, NumPy mendukung floor division menggunakan operator //.
print(A2 // A1)
Floor division menghasilkan nilai pembagian yang dibulatkan ke bawah sesuai aturan floor pada Python.
Contoh sederhana:
print(7 // 2)
Output:
3
Sedangkan:
print(10 // 3)
menghasilkan:
3
Floor division berbeda dengan pembagian standar:
print(7 / 2)
Output:
3.5
Jadi:
| Operator | Keterangan |
|---|---|
/ | Pembagian standar |
// | Floor division |
Perpangkatan
NumPy mendukung operasi perpangkatan menggunakan operator **.
Contohnya:
A1 = np.array([1, 2, 3])
print(A1 ** 2)
Output:
[1 4 9]
Operasi dilakukan pada setiap elemen:
1² = 1
2² = 4
3² = 9
NumPy juga menyediakan fungsi np.square().
print(np.square(A1))
Output:
[1 4 9]
Dengan demikian:
A1 ** 2
dan:
np.square(A1)
menghasilkan hasil yang sama untuk kasus tersebut.
Modulo
Operator % digunakan untuk mendapatkan sisa hasil pembagian.
Contohnya:
A2 = np.array([
[1., 2., 3.3],
[4., 5., 6.5]
])
print(A2 % 2)
Hasilnya:
[[1. 0. 1.3]
[0. 1. 0.5]]
Contoh sederhana:
print(7 % 2)
Output:
1
Karena:
7 ÷ 2 = 3 sisa 1
Modulo sering digunakan dalam pemrograman untuk mengetahui apakah sebuah angka memiliki sisa pembagian tertentu, misalnya dalam pemeriksaan bilangan genap dan ganjil.
Broadcasting
Salah satu kemampuan penting NumPy adalah broadcasting.
Broadcasting memungkinkan operasi aritmatika dilakukan pada array yang memiliki shape berbeda selama shape tersebut memenuhi aturan broadcasting NumPy.
Contohnya:
A1 = np.array([1, 2, 3])
A2 = np.array([
[1., 2., 3.3],
[4., 5., 6.5]
])
Shape kedua array:
print(A1.shape)
print(A2.shape)
Output:
(3,)
(2, 3)
Walaupun shape berbeda, operasi berikut dapat dilakukan:
print(A1 * A2)
Hasilnya:
[[ 1. 4. 9.9]
[ 4. 10. 19.5]]
Mengapa bisa?
Karena:
A1 → (3,)
A2 → (2, 3)
Shape (3,) kompatibel dengan dimensi terakhir (3) pada (2, 3).
Secara konsep, NumPy memperlakukan A1 seolah-olah nilainya tersedia untuk setiap baris:
[1, 2, 3]
↓
[1, 2, 3]
[1, 2, 3]
Kemudian operasi dilakukan secara element-wise.
Cara Kerja Broadcasting Secara Sederhana
Misalnya terdapat:
A = np.array([
[1, 2, 3],
[4, 5, 6]
])
B = np.array([10, 20, 30])
Shape:
A → (2, 3)
B → (3,)
Operasi:
A + B
dapat dilakukan karena B kompatibel dengan dimensi terakhir A.
Secara konsep:
[1, 2, 3] [10, 20, 30]
[4, 5, 6] + [10, 20, 30]
Hasil:
[11, 22, 33]
[14, 25, 36]
Dengan broadcasting, kita tidak perlu membuat array B secara manual sebanyak jumlah baris A.
Broadcasting Tidak Selalu Berhasil
Tidak semua shape dapat digunakan bersama.
Contohnya:
A = np.array([
[1, 2, 3],
[4, 5, 6]
])
B = np.array([10, 20])
A + B
Shape:
A → (2, 3)
B → (2,)
Operasi tersebut akan menghasilkan error karena shape (2,) tidak kompatibel dengan dimensi terakhir (3) pada A.
Biasanya NumPy akan memberikan error seperti:
ValueError: operands could not be broadcast together
Ketika menemukan error seperti ini, hal pertama yang sebaiknya dilakukan adalah memeriksa shape kedua array:
print(A.shape)
print(B.shape)
Mengubah Shape dengan reshape()
Salah satu cara untuk menyesuaikan shape adalah menggunakan reshape().
Contohnya:
A = np.array([1, 2, 3])
print(A.shape)
Output:
(3,)
Array tersebut dapat diubah menjadi array dua dimensi:
A_reshaped = A.reshape(1, 3)
print(A_reshaped)
print(A_reshaped.shape)
Output:
[[1 2 3]]
(1, 3)
Perubahan shape dapat membantu ketika kita ingin melakukan operasi terhadap array dengan dimensi tertentu.
Namun, reshape() sebaiknya tidak digunakan secara sembarangan hanya untuk menghilangkan error. Kita harus memahami bentuk data yang sebenarnya dibutuhkan oleh operasi tersebut.
Fungsi Matematika NumPy
Selain operator matematika dasar, NumPy menyediakan berbagai fungsi matematika.
Beberapa fungsi yang sering digunakan antara lain:
| Fungsi | Kegunaan |
|---|---|
np.add() | Penjumlahan |
np.subtract() | Pengurangan |
np.multiply() | Perkalian |
np.divide() | Pembagian |
np.square() | Pangkat dua |
np.power() | Perpangkatan |
np.exp() | Eksponensial |
np.log() | Logaritma natural |
np.sqrt() | Akar kuadrat |
Fungsi-fungsi tersebut umumnya bekerja secara element-wise.
Fungsi Eksponensial
np.exp() digunakan untuk menghitung eksponensial berbasis bilangan Euler e.
Contohnya:
A1 = np.array([1, 2, 3])
print(np.exp(A1))
Secara konsep, NumPy menghitung:
e¹
e²
e³
untuk setiap elemen array.
Fungsi ini banyak digunakan dalam berbagai perhitungan numerik dan machine learning.
Fungsi Logaritma
NumPy menyediakan np.log() untuk menghitung logaritma natural.
A1 = np.array([1, 2, 3])
print(np.log(A1))
Operasi dilakukan pada setiap elemen array.
Selain np.log(), NumPy juga memiliki fungsi lain seperti:
np.log10(A1)
untuk logaritma berbasis 10.
Operasi Aritmatika Tanpa Perulangan Manual
Salah satu keunggulan NumPy adalah kita tidak perlu membuat loop secara manual untuk melakukan operasi terhadap setiap elemen.
Misalnya menggunakan Python biasa:
numbers = [1, 2, 3, 4, 5]
result = []
for number in numbers:
result.append(number * 2)
print(result)
Dengan NumPy, operasi tersebut dapat ditulis lebih sederhana:
numbers = np.array([1, 2, 3, 4, 5])
result = numbers * 2
print(result)
Output:
[ 2 4 6 8 10]
Pendekatan seperti ini disebut vectorization.
Vectorization merupakan salah satu alasan NumPy sangat banyak digunakan dalam Data Science dan Machine Learning.
Vectorization
Vectorization adalah pendekatan melakukan operasi terhadap banyak data sekaligus menggunakan operasi array, daripada melakukan perulangan Python satu per satu.
Contohnya:
A = np.array([1, 2, 3, 4, 5])
A * 10
Hasil:
[10 20 30 40 50]
Kita tidak perlu membuat:
for value in A:
...
untuk operasi sederhana tersebut.
Konsep ini sangat penting karena data dalam Machine Learning biasanya terdiri dari banyak nilai numerik yang perlu diproses secara bersamaan.
Memeriksa Shape Sebelum Melakukan Operasi
Ketika bekerja dengan array multidimensi, biasakan memeriksa shape sebelum melakukan operasi.
Gunakan:
print(A.shape)
Untuk mengetahui jumlah dimensi:
print(A.ndim)
Contohnya:
A = np.array([
[1, 2, 3],
[4, 5, 6]
])
print(A.shape)
print(A.ndim)
Output:
(2, 3)
2
Informasi tersebut membantu kita memahami bentuk data sebelum melakukan operasi matematika.
Workflow Operasi Array
Ketika melakukan operasi terhadap NumPy array, workflow sederhana yang dapat digunakan adalah:
Membuat Array
↓
Memeriksa Shape
↓
Menentukan Operasi
↓
Melakukan Operasi
↓
Memeriksa Hasil
↓
Jika Error → Periksa Shape
↓
Gunakan reshape() jika memang diperlukan
Contohnya:
A = np.array([1, 2, 3])
B = np.array([10, 20, 30])
print(A.shape)
print(B.shape)
result = A + B
print(result)
Output:
(3,)
(3,)
[11 22 33]
Kesalahan yang Sering Terjadi
Menganggap * sebagai Perkalian Matriks
Pada NumPy:
A * B
merupakan perkalian element-wise.
Jadi jangan langsung menganggap operator * sebagai perkalian matriks.
Mengabaikan Shape
Ketika operasi array menghasilkan error, jangan langsung mencoba mengubah array secara acak.
Periksa terlebih dahulu:
print(A.shape)
print(B.shape)
Kemudian pahami apakah operasi yang ingin dilakukan memang sesuai dengan struktur data.
Menggunakan reshape() Tanpa Memahami Data
reshape() hanya mengubah bentuk array selama jumlah elemennya tetap sesuai.
Contohnya:
A = np.array([1, 2, 3, 4, 5, 6])
A.reshape(2, 3)
valid karena:
6 elemen → 2 × 3 = 6
Sedangkan:
A.reshape(4, 2)
tidak valid karena:
6 elemen ≠ 4 × 2
Ringkasan
Pada materi ini kita telah mempelajari berbagai operasi aritmatika pada NumPy array.
Hal-hal penting yang perlu diingat:
- Operasi NumPy umumnya dapat dilakukan secara element-wise.
- Operator
+digunakan untuk penjumlahan. - Operator
-digunakan untuk pengurangan. - Operator
*digunakan untuk perkalian element-wise. - Operator
/digunakan untuk pembagian. - Operator
//digunakan untuk floor division. - Operator
**digunakan untuk perpangkatan. - Operator
%digunakan untuk modulo. - NumPy menyediakan berbagai fungsi matematika seperti
np.exp(),np.log(), dannp.square(). - Broadcasting memungkinkan operasi dilakukan pada array dengan shape yang berbeda selama shape tersebut kompatibel.
reshape()dapat digunakan untuk mengubah shape array ketika memang sesuai dengan kebutuhan operasi.- Vectorization memungkinkan operasi terhadap banyak data dilakukan tanpa loop Python secara manual.
- Memeriksa
.shapemerupakan kebiasaan penting ketika bekerja dengan array multidimensi.
Checklist Pembelajaran
Pastikan Anda sudah memahami:
- Apa yang dimaksud dengan element-wise operation.
- Cara melakukan penjumlahan array.
- Cara melakukan pengurangan array.
- Cara melakukan perkalian array.
- Cara melakukan pembagian array.
- Perbedaan
/dan//. - Cara melakukan perpangkatan menggunakan
**. - Apa fungsi operator
%. - Apa yang dimaksud dengan broadcasting.
- Mengapa beberapa operasi array menghasilkan
ValueError. - Cara memeriksa
.shape. - Kegunaan
reshape(). - Apa yang dimaksud dengan vectorization.
- Kegunaan fungsi matematika seperti
np.exp()dannp.log().
Latihan
Gunakan NumPy untuk membuat array berikut:
A = np.array([10, 20, 30, 40, 50])
Kemudian lakukan:
- Tambahkan angka
5ke seluruh elemen. - Kurangi seluruh elemen dengan
2. - Kalikan seluruh elemen dengan
3. - Bagi seluruh elemen dengan
10. - Hitung kuadrat setiap elemen.
- Hitung sisa pembagian setiap elemen dengan
3. - Hitung
np.exp()untuk setiap elemen. - Periksa
shapedanndimarray. - Buat array dua dimensi dan coba lakukan operasi broadcasting.
- Sengaja gunakan dua shape yang tidak kompatibel dan amati error yang dihasilkan.
Tujuan latihan bukan hanya mendapatkan output yang benar, tetapi juga memahami mengapa operasi tersebut dapat atau tidak dapat dilakukan oleh NumPy.