Outline

Outline

Kembali ke Metode Numerik

Selamat datang di praktikum Metode Numerik!

Pada praktikum ini, kalian akan diajarkan esensial-esensial yang dibutuhkan dan algoritma dasar untuk metode-metode pada Metnum.

Semua modul telah diuji menggunakan Jupyter Notebook dengan Python 3.11, serta Google Colaboratory yang menggunakan Python 3.9. Semua kode pada modul masih bisa digunakan untuk semua Python versi 3.6 ke atas.

Kalian juga bisa menggunakan aplikasi/IDE (Integrated Development Environment) lainnya seperti PyCharm, Spyder, atau bahkan IDLE (IDLE adalah IDE bawaan Python yang diinstal dari python.org), namun kalian disarankan menggunakan Jupyter Notebook atau Google Colaboratory karena file tugas menggunakan file format .ipynb.

Berikut topik-topik yang akan dibahas pada Modul 1 ini:

  • Review Python
    • Operasi, Variabel, dan Comment
    • String dan Formatting
    • Input nilai
    • List
    • Pernyataan Kondisional
    • Looping
  • Error Handling
  • NumPy
  • Tabulate

1. Review Python

Operasi, Variabel, dan Comment

Di Python, kita bisa melakukan beberapa operasi aritmetika, menggunakan simbol sebagai berikut:

(+) untuk penjumlahan

(-) untuk pengurangan

(*) untuk perkalian

(/) untuk pembagian

(**) untuk pangkat

(%) untuk operasi mod atau modulo (sisa pembagian)

(//) untuk operasi div (hasil bagi tanpa sisa)

print(5 + 2)
print(5 - 2)
print(5 * 2)
print(5 / 2)
print(5 ** 2)
print(5 % 2)
print(5 // 2)
7
3
10
2.5
25
1
2

Seandainya kita tidak menggunakan print untuk menampilkan hasil perhitungan,

5 + 2
7
5 - 2
5 * 2
10

maka hanya hasil dari baris terakhir yang akan ditampilkan. Oleh karena itu, sangat disarankan untuk SELALU menuliskan print, termasuk untuk baris terakhir, agar modifikasi program menjadi lebih mudah dan cepat, apalagi ketika ingin menambah baris baru.

Perhatikan bahwa tanda % sudah dikhususkan untuk modulo, sehingga artinya BUKAN PERSEN, ya! Persen dalam Python bisa dituliskan sebagai pembagian dengan 100 (sesuai definisi persen), misalnya untuk 50% atau 21%:

print(50/100)
print(21/100)
0.5
0.21

Kita bisa menyimpan nilai (termasuk hasil perhitungan) ke suatu tempat penyimpanan yang disebut variabel. Tiap variabel memiliki nama tersendiri, yang kita definisikan sendiri. Proses penyimpanan nilai ke suatu variabel disebut proses assignment, yang memiliki syntax (cara penulisan) sebagai berikut:

contoh_variabel = 23

di mana 23 adalah contoh nilai yang ingin dipasang ke contoh variabel yang kita beri nama “contoh_variabel”. Untuk assignment, tanda = cukup ditulis sekali saja, ya!

Kemudian, kita bisa menggunakan print untuk menampilkan isi variabel tersebut.

contoh_variabel = 23
print(contoh_variabel)
23

Jangan sampai salah ketik, ya! Penggunaan huruf besar/kecil perlu diperhatikan, jangan sampai tertukar.

print(contoh_Variabel)
NameError: name 'contoh_Variabel' is not defined

Kita mendapat error “name ‘contoh_Variabel’ is not defined”, artinya ‘contoh_Variabel’ itu tidak didefinisikan, karena Python menganggap itu berbeda dengan contoh_variabel yang memang sudah kita definisikan. Tentu kita tetap bisa mendefinisikannya:

contoh_variabel = 23
contoh_Variabel = 45
print(contoh_variabel)
print(contoh_Variabel)
23
45

Ada beberapa hal yang dilarang dalam penamaan variabel.

  1. Nama variabel hanya boleh terdiri dari huruf, angka, dan tanda _
  2. Nama variabel tidak boleh diawali angka

Contoh penamaan yang valid (boleh, bisa diterima):

abc1 = 21
xyz9000 = 3

Karena valid, variabel berhasil tersimpan dengan baik, sehingga bisa dilihat isinya:

print(abc1)
print(xyz9000)
21
3

Contoh penamaan yang dilarang (akan menghasilkan error):

999nama = 10
SyntaxError: invalid decimal literal (678666226.py, line 1)

Selain keterangan spesifik seperti “invalid decimal literal”, kita juga bisa mendapatkan keterangan error yang lebih umum yaitu “invalid syntax” atau “syntax tidak valid”. Karena terjadi error, proses assignment tidak berhasil, sehingga kita tidak bisa melihat isinya karena variabel tersebut memang gagal didefinisikan:

print(999nama)
SyntaxError: invalid decimal literal (4165728206.py, line 1)

Kita juga bisa menggunakan variabel, seperti mengoperasikan variabel untuk menghasilkan nilai baru:

print(abc1 * 10)
print(abc1 / xyz9000)
210
7.0

Bahkan, kita bisa memasang hasil operasi tersebut ke variabel lain:

hasil_bagi = abc1 / xyz9000
print(hasil_bagi)
7.0

Perhatikan potongan kode berikut.

a = 6
b = 3
print(a / b)
a, b = b, a
print(a / b)
2.0
0.5

Pada baris 4, kita menukar nilai pada variabel a dan b. Python bisa meng-assign lebih dari 1 variabel dalam 1 baris, cukup dengan memisahkan tiap variabel dan nilai dengan , (tanda koma).

x, y, z = 0, 1, 2
print(x)
print(y)
print(z)
0
1
2

Walaupun cara tersebut berlaku untuk sebanyak-banyaknya variabel, pada umumnya lebih baik melakukan assignment satu variabel per baris saja agar kode tetap mudah dibaca, apalagi fitur tersebut hanya ada di bahasa pemrograman Python.

Penukaran variabel tetap bisa dilakukan sesuai cara yang dipelajari di mata kuliah Algortma dan Pemrograman, yaitu dengan bantuan variabel yang bisa dinamakan temp atau semacamnya (variabel dummy yang “tidak penting” dan hanya digunakan untuk bantuan sementara saja):

c = 10
d = 5
print(c/d)
temp = d
d = c
c = temp
print(c/d)
2.0
0.5

atau sama saja,

c = 10
d = 5
print(c/d)
temp = c
c = d
d = temp
print(c/d)
2.0
0.5

Terkadang, program yang kita buat bisa menjadi rumit, sehingga kita perlu menambahkan semacam penjelasan atau catatan supaya orang lain bisa lebih memahami kode kita. Di Python, kita bisa menambahkan comment atau semacam catatan di samping kanan tiap baris (atau pada baris tersendiri), dimulai dengan tanda #

print("Selamat pagi") # buat apa? gapapa iseng aja
# print("Selamat siang")
print("Selamat sore") # wah dari pagi langsung sore
Selamat pagi
Selamat sore

Python tidak memperhatikan comment sama sekali. Adanya fitur comment hanyalah untuk membantu kita sebagai programmer.

String dan Formatting

Di Python, selain tipe data numerik/angka, ada juga yang dinamakan “string”, yaitu kumpulan huruf/karakter/kata, yang bisa diawali dan diakhiri dengan tanda petik ’ atau tanda kutip ”

mata_kuliah = "Metode Numerik"
departemen = 'matematika'
gelar = 'S1'
print(mata_kuliah)
print(departemen)
print(gelar)
Metode Numerik
matematika
S1

Penggunaan tanda petik ataupun tanda kutip itu sama-sama valid, yang penting konsisten.

Suatu string bisa dicek “panjang”nya, atau jumlah karakter di dalam string (termasuk spasi, koma, dan sebagainya), dengan len (artinya length):

panjang1 = len(mata_kuliah)
panjang2 = len(departemen)
panjang3 = len(gelar)
print(panjang1)
print(panjang2)
print(panjang3)
14
10
2

String juga bisa digabung dengan semacam “penjumlahan” atau penggabungan (juga disebut string concatenation):

nama_depan = "Johan"
nama_tengah = "Frederik"
nama_belakang = "Steffensen"
print(nama_depan + nama_belakang)
print(nama_depan + nama_tengah + nama_belakang)
JohanSteffensen
JohanFrederikSteffensen

Perhatikan bahwa, pada ketiga string yang kita definisikan, tidak ada spasi, sehingga dalam penggabungannya itu juga tidak ada spasi.

Penggabungan string tidak harus antar variabel, bisa juga antar nilai, atau bahkan antara variabel dengan nilai.

print("Halo! Nama saya " + nama_depan)
Halo! Nama saya Johan

Kita telah menggabungkan string “Halo! Nama saya” dengan variabel nama_depan (perhatikan bahwa string tersebut diakhiri satu spasi).

print(nama_belakang + ", " + nama_depan + " " + nama_tengah)
Steffensen, Johan Frederik

Di sini, kita telah menggabungkan variabel nama_belakang dengan suatu string yang tediri dari dua karakter (yaitu koma dan spasi), yang kemudian digabungkan dengan variabel nama_depan, kemudian suatu string yang terdiri dari spasi saja, dan akhirnya dengan variabel nama_tengah.

Penjumlahan yang dilakukan secara berulang kali adalah perkalian. Begitu juga untuk string:

print(3 * "Belajar")
print("Panik" * 5)
BelajarBelajarBelajar
PanikPanikPanikPanikPanik

Kita juga bisa mengubah atau mengkonversi nilai selain string (seperti angka) agar menjadi string dan bisa digabungkan juga, menggunakan str. Contohnya,

nilai_semester = 2
string_semester = str(nilai_semester)
print("Saya masih semester " + string_semester)
Saya masih semester 2

Seandainya kita tidak mengkonversi nilai tersebut, akan terjadi error:

nilai_semester = 2
print("Saya masih semester " + nilai_semester)
TypeError: can only concatenate str (not "int") to str

Python hanya paham cara menggabungkan string dengan string, bukan string dengan selain string, sehingga kita harus mengkonversi nilai tersebut menjadi string terlebih dahulu.

Sebaliknya, kita juga bisa “menghilangkan tanda petik/kutip” dari suatu string (misalnya untuk mengkonversi kembali menjadi angka), dengan eval.

angka_semester = eval(string_semester)
semester_atas = 2 + angka_semester
string_atas = str(semester_atas)
print("Dia sudah semester " + string_atas)
Dia sudah semester 4

Seandainya tidak digunakan eval,

semester_atas =  2 + string_semester
TypeError: unsupported operand type(s) for +: 'int' and 'str'

Lagi-lagi, Python tidak paham penjumlahan antara bilangan dengan string.

Ada cara lain untuk memadukan nilai string dengan variabel yang berisi string, yaitu dengan yang namanya string formatting. Sejak Python 3.6, ada yang namanya f-strings, yang diawali dengan huruf “f” tepat sebelum penulisan string. Pada suatu f-string, kita bisa menggunakan kurung kurawal yaitu { dan } untuk menggantikan isi string dengan suatu variabel, yang nama variabelnya kita masukkan ke dalam kurung kurawal tersebut.

Misalnya, kita bisa memasukkan nilai variabel mata_kuliah di dalam suatu f-string, seperti berikut:

print(f"Saya sedang mengikuti praktikum {mata_kuliah}.")
Saya sedang mengikuti praktikum Metode Numerik.

Tentu, kita bisa menyisipkan lebih dari satu variabel.

print(f"Saya sedang mengikuti praktikum {mata_kuliah} untuk mendapatkan gelar {gelar}.")
Saya sedang mengikuti praktikum Metode Numerik untuk mendapatkan gelar S1.

Selain menggunakan f-string, kita juga bisa menggunakan .format() pada akhir string (fitur ini sudah ada sejak Python 3.0), dengan syntax sebagai berikut:

print("Saya sedang mengikuti praktikum {0} untuk mendapatkan gelar {1}".format(mata_kuliah, gelar))
Saya sedang mengikuti praktikum Metode Numerik untuk mendapatkan gelar S1

Agar kode lebih mudah dibaca,

kalimat = "Saya sedang mengikuti praktikum {0} untuk mendapatkan gelar {1}".format(mata_kuliah, gelar)
print(kalimat)
Saya sedang mengikuti praktikum Metode Numerik untuk mendapatkan gelar S1

Perhatikan bahwa, dengan cara .format(), kita harus mengisi tempat penyisipan dengan {0}, {1}, {2}, dan seterusnya tergantung banyaknya penyisipan, kemudian variabel-variabel yang ingin disisipkan itu baru ditempel di akhir, yaitu di dalam kurung .format().

Lagi-lagi, kedua cara sama-sama valid, yang penting konsisten. Ketika hendak menggunakan f-string, jangan tiba-tiba mengetik .format() pada akhir f-string.

Sebagai tambahan, kita bisa menyisipkan angka, dan kita juga bisa mempersingkat penulisannya menjadi beberapa angka di belakang koma, misalnya cukup 7 angka di belakang koma:

akar_dua = 2**(1/2)
print("Akar dua bernilai kurang lebih {0:.7f}".format(akar_dua))
print("atau lebih tepatnya {0}".format(akar_dua))
Akar dua bernilai kurang lebih 1.4142136
atau lebih tepatnya 1.4142135623730951

Beberapa link (pengayaan, tidak wajib) untuk mempelajari string formatting lebih lanjut:

Input nilai

Selain mengeluarkan output atau menampilkan nilai, Python juga bisa menerima nilai (yang kemudian dipasangkan ke variabel), menggunakan input(pesan), di mana pesan yang ada di dalam kurung itu bisa berisi pertanyaan yang ingin ditanyakan, atau keterangan yang diminta:

angkatan = input("Masukkan angkatan: ")
print("Anda angkatan " + angkatan)
Masukkan angkatan: 2022
Anda angkatan 2022

Perhatikan bahwa input telah masuk dalam bentuk string, sehingga bisa langsung digabungkan dengan string lainnya. Karena masih berbentuk string, operasi aritmetika tidak sesuai harapan:

angka = input("Masukkan angka: ")
dobel = angka / 2
print("Setelah dibagi dua, angka tersebut menjadi " + str(dobel))
Masukkan angka: 24
TypeError: unsupported operand type(s) for /: 'str' and 'int'

Terjadi error karena operasi pembagian tidak bisa dilakukan pada string. Oleh karena itu, kita juga perlu eval agar nilai yang masuk itu dihilangkan tanda petik/kutipnya agar tidak lagi berbentuk string.

angka = eval(input("Masukkan angka: "))
dobel = angka / 2
print("Setelah dibagi dua, angka tersebut menjadi " + str(dobel))
Masukkan angka: 24
Setelah dibagi dua, angka tersebut menjadi 12.0

Kombinasi eval(input(pesan)) akan sering digunakan selama praktikum Metode Numerik.

List

Suatu list bisa menyimpan beberapa nilai sekaligus, yang masing-masing disebut elemen dari list tersebut. Pendefinisiannya menggunakan kurung siku, di mana tiap elemen dituliskan di dalamnya, saling dipisahkan dengan koma:

buah = ["apel", "pisang", "jeruk"]
print(buah)
['apel', 'pisang', 'jeruk']

Tiap elemen memiliki posisi atau indeks (index). Di Python, indeks dimulai dari 0 (nol). Kita bisa memeriksa elemen pada indeks ke-sekian di list, dengan menuliskan nama list tersebut, diikuti dengan kurung siku yang berisi indeks ke berapa yang ingin dilihat nilainya.

print(buah[0])
print(buah[1])
print(buah[2])
apel
pisang
jeruk

Suatu list bisa berisi beragam tipe data, tidak hanya string tetapi juga angka, atau bahkan keduanya sekaligus.

data_diri = ["Guido van Rossum", 1956, "Belanda", "Pembuat bahasa pemrograman Python"]
print("Nama: " + data_diri[0])
print("Tahun kelahiran: " + str(data_diri[1]))
print("Kewarganegaraan: " + data_diri[2])
print("Dikenal sebagai: " + data_diri[3])
Nama: Guido van Rossum
Tahun kelahiran: 1956
Kewarganegaraan: Belanda
Dikenal sebagai: Pembuat bahasa pemrograman Python

Kita dapat menambahkan elemen baru pada akhir list menggunakan .append()

prima = [2, 3, 5]
print(prima)
prima.append(7)
print(prima)
[2, 3, 5]
[2, 3, 5, 7]

Pernyataan Kondisional

Seringkali kita dihadapi oleh beberapa kondisi. Misalkan pada metode Bisection, kalian perlu mengecek apakah nilai fungsi di ujung-ujung intervalnya berbeda tanda atau tidak. Jika tidak, metode tidak bisa berjalan. Maka, kita perlu menggunakan pernyataan kondisional.

Terdapat tiga pernyataan kondisional: * If…else berguna jika hanya ada satu kondisi yang perlu dicek, dan perlu ada aksi yang dijalankan jika kondisi tidak terpenuhi. * If…elif berguna jika ada lebih dari satu kondisi yang perlu dicek, dan tidak ada aksi yang dijalankan apabila semua kondisi tidak terpenuhi. * If…elif…else berguna jika ada lebih dari satu kondisi yang perlu dicek, dan perlu ada aksi yang dijalankan jika kondisi tidak terpenuhi.

Advanced note: Ada pernyataan kondisional lain, yaitu try…except, naum akan dijelaskan pada bagian selanjutnya

x = eval(input('Masukkan bilangan: '))
if x < 0:
    print('Haha')
elif x >= 0 and x <= 4:
    print('Hehe')
else:
    print('Hoho')
Masukkan bilangan: 2
Hehe

Looping

Kebanyakan metode pada Metnum bersifat iteratif, artinya algoritmanya dijalankan berulang hingga tercapai batas tertentu (biasanya terdapat nilai toleransi antara aproksimasi dengan nilai eksaknya). Looping pada Python biasanya menggunakan for loop dan while loop.

for loop digunakan ketika kita mengetahui berapa kali kita harus mengulang perintah. Beberapa cara untuk for loop:

  • for i in range(a, b, n) : Loop ini akan membuat for loop berjalan mulai dari a hingga b - 1 dengan step sebesar n. Argumen n bersifat opsional dengan nilai default 1. Jika menggunakan range(b), maka bisa dianggap a = 0.
  • for i in list atau for i in string : Loop ini akan membuat for loop mengiterasikan tiap elemen list atau karakter string yang akan disimpan pada i. while loop digunakan ketika ada syarat tertentu yang harus dipenuhi untuk mengulang perintah tersebut.
  • while cond : Loop ini akan membuat while loop berjalan selama cond bernilai True . Berhati-hatilah dalam menggunakan while loop. Pastikan kondisi yang dimasukkan akan bisa bernilai False . Jika tidak, maka kode akan stuck di infinite loop.

Advanced note: range() sejatinya adalah fungsi yang mengoutput list angka dengan aturan seperti di atas.

print('FOR LOOP EXAMPLE 1')
for i in range(3):
    print('Print 3 kali')
print('FOR LOOP EXAMPLE 2')
for i in range(1, 4):
    print(2 * i)
print('FOR LOOP EXAMPLE 3')
for i in range(1, 10, 3):
    print('Angka sekarang:', i)
print('FOR LOOP EXAMPLE 4')
for i in [1, 4, 8, 2]:
    print(i)
print('FOR LOOP EXAMPLE 5')
for i in 'mondstad':
    if i == 'd':
        print(i)
print('WHILE LOOP EXAMPLE')
i = 0
while i <= 5:
    print('Hati-hati while')
    i += 1
print('While iteration DONE')
FOR LOOP EXAMPLE 1
Print 3 kali
Print 3 kali
Print 3 kali
FOR LOOP EXAMPLE 2
2
4
6
FOR LOOP EXAMPLE 3
Angka sekarang: 1
Angka sekarang: 4
Angka sekarang: 7
FOR LOOP EXAMPLE 4
1
4
8
2
FOR LOOP EXAMPLE 5
d
d
WHILE LOOP EXAMPLE
Hati-hati while
Hati-hati while
Hati-hati while
Hati-hati while
Hati-hati while
Hati-hati while
While iteration DONE

2. Error Handling

Misalkan kalian membuat program tentang menghitung kebalikan dari suatu bilangan bulat. Tentu bilangan selain nol memiliki kebalikan. Namun, apa yang terjadi jika kalian memasukkan 0 sebagai input? Pasti error.

Error pada program mengakibatkan program terhenti di tengah-tengah, sehingga belum semua baris dieksekusi. Mungkin tidak berpengaruh banyak jika programnya digunakan untuk sendiri, namun seandainya kalian membuat program yang digunakan untuk mengatur server perusahaan, entah apa jadinya kalau programnya error.

Untuk itu, terdapat cara untuk mengatasi error tersebut. Di Python, kalian dapat menggunakan try…except . Ini adalah penyataan kondisional serupa dengan if…else , namun pengecekan dilakukan pada bagian try . Jika pada bagian tersebut tidak ada masalah yang menyebabkab error, maka bagian except tidak dijalankan. Sebaliknya, jika error, maka bagian except akan dijalankan. Ada beberapa macam error di Python:

  • ZeroDivisionError : Error ini keluar jika terdapat pembagian dengan nol.
  • ValueError : Error ini keluar jika tipe data yang dimasukkan tidak bisa diproses karena tidak sesuai. dll. Silahkan cari di Google :)

Advanced note: Kalian dapat mengecek tipe data pada python dengan fungsi type() .

try:
    x = int(input('Masukkan integer taknol: '))
    print(1 / x)
except:
    print('Yhaa programnya error :(')
Masukkan integer taknol: 0
Yhaa programnya error :(

3. Numpy

NumPy adalah package Python yng sangat multifungsi. Kita akan menggunakan NumPy untuk membuat array yang elemennya hanya mempunyai satu tipe data. NumPy juga mempunyai fungsi fungsi seperti sin, cos, log, dll.

Mula-mula, kita perlu meng-import package NumPy.

import numpy as np

Jika pada langkah ini kalian menemukan error, kemungkinan besar kalian belum mempunyai package NumPy terinstal. Jika kalian menggunakan Jupyter Notebook atau Spyder melalui Anaconda, kalian bisa mencoba mengikuti langkah ini:

  • Buka Anaconda Prompt
  • Ketik conda install numpy (Jika tidak berhasil gunakan pip install numpy )
  • Tunggu hingga proses mengunduh selesai.

Alternatif yang lebih mudah adalah langsung mengetik pip install numpy (atau !pip install numpy dengan tanda seru) pada Jupyter Notebook (bisa juga pada Google Colaboratory), kemudian menutup dan membuka kembali Jupyter Notebook:

pip install numpy
Requirement already satisfied: numpy in /Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages (1.24.2)
Note: you may need to restart the kernel to use updated packages.
!pip install numpy
Requirement already satisfied: numpy in /Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages (1.24.2)

Numpy Array

Seperti yang sudah dikatakan sebelumnya, list bukan array karena dapat diisi dengan berbagai tipe data. Kalau begitu, bagaimana array yang benar? Di NumPy, ada fungsi bernama array yang berfungsi mengubah list menjadi array.

A = np.array([True, 4, 7.5, 'Jean'])
B = np.array([5, 6.2])
C = np.array([4, 2, -1, -3])
type(A)
numpy.ndarray

Terlihat tipe data dari A bukan list, melainkan numpy.ndarray. Perhatikan juga bahwa kita mengisi list yang akan dijadikan array A dan B dengan beragam tipe data…

print(A)
print(B)
print(C)
['True' '4' '7.5' 'Jean']
[5.  6.2]
[ 4  2 -1 -3]

…maka tipe datanya akan berubah menjadi sama. Karena NumPy array hanya bisa menyimpan satu tipe data, maka jika tipenya berbeda akan berubah. Urutan pengecekannya adalah string , float , integer , boolean (tipe data boolean menyimpan nilai 1 jika True dan 0 jika False ).

Kita juga dapat membuat array 2 dimensi seperti matriks, dan jika di-print, maka outputnya juga seperti matriks.

P = np.array([[1, 2],[-1, 0]])
Q = np.array([[4, -1],[5, 0]])
R = np.array([[1, 2, 4, 5], [-1, -8, 9, 11], [3, -2, -4, 6]])

Di sini kalian juga bisa melakukan indexing dan slicing seperti halnya pada liat.

print(A[0])
print(B[-1])
print(P[0])
print(Q[0,1])
print()
print(A[2:])
print(R[1:])
print(R[1, 2:])
print(R[:, 1])
True
6.2
[1 2]
-1

['7.5' 'Jean']
[[-1 -8  9 11]
 [ 3 -2 -4  6]]
[ 9 11]
[ 2 -8 -2]

Operasi aritmatika juga dapat diterapkan pada NumPy array. Operasi aritmatika antar dua NumPy array akan dilakukan secara element- wise, artinya operasinya dilakukan tiap elemen (bukan seperti dot product pada aljabar linear).

A = np.array([1, 4, 7, 10])
B = np.array([1, 2, 3, 4])
#operasi pada array
print(A + B)
print(A - B)
print(A * B)
print(A / B)
print(A % B)
print(A // B)
print(A ** B)
[ 2  6 10 14]
[0 2 4 6]
[ 1  8 21 40]
[1.         2.         2.33333333 2.5       ]
[0 0 1 2]
[1 2 2 2]
[    1    16   343 10000]

Selain itu, operasi aritmatika juga bisa dilakukan dengan skalar. Operasi aritmatika antara NumPy array dengan suatu skalar akan dilakukan seolah-olah skalar tersebut adalah NumPy array berukuran sama yang isinya skalar tersebut. Istilahnya biasanya disebut Broadcasting

print(A + 2)
print(C * 3)
print(P ** 2)
print(1 / R)
[ 3  6  9 12]
[12  6 -3 -9]
[[1 4]
 [1 0]]
[[ 1.          0.5         0.25        0.2       ]
 [-1.         -0.125       0.11111111  0.09090909]
 [ 0.33333333 -0.5        -0.25        0.16666667]]

4. Tabulate

Untuk menyajikan hasil iterasi, tabel sering digunakan karena akan mudah membacanya. Di Python, terdapat package untuk membuat tabel dengan cara sederhana. Package tersebut bernama tabulate.

Seperti package umumnya, pertama kita import terlebih dahulu.

from tabulate import tabulate

Seperti pada kasus NumPy, apabila terjadi error (karena tabulate belum terinstall), kalian bisa mengetik pip install tabulate

pip install tabulate
Requirement already satisfied: tabulate in /Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages (0.9.0)
Note: you may need to restart the kernel to use updated packages.

dan seperti biasa, setelah instalasi selesai, mungkin kalian perlu menutup kemudian membuka kembali Jupyter Notebook sebelum bisa menggunakan tabulate.

Sekarang, buat konten tabel. Konten tabel disimpan dalam list/array 2-D dimana setiap array di dalamnya adalah baris.

Headers dari tabel dapat kita buat sendiri. Jumlah dari headers harus sama dengan jumlah elemen pada setiap array.

‘tablefmt’ adalah format bentuk tabel. Bentuk yang biasa digunakan adalah “orgtbl”, dan ada macam-macam bentuk tabel yang bisa kalian cari sendiri di Google.

table = [["Jeruk", 1], ["Nanas", 2]]
print(tabulate(table, headers = ["Buah", "Kuantitas"], tablefmt = "orgtbl"))
| Buah   |   Kuantitas |
|--------+-------------|
| Jeruk  |           1 |
| Nanas  |           2 |

Dalam membuat konten tabel, panjang dari setiap list harus sama dengan banyak headers. Apabila ada baris yang banyak elemennya melebihi banyak headers, maka elemen yang diambil adalah elemen sebanyak headers yang pertama. Kolom paling kiri diisi terlebih dahulu.

Perhatikan contoh berikut.

table = [["Jeruk", 1, 4], ["Nanas", 2, 3, 5], ["Mangga", 3]]
print(tabulate(table, headers = ["Buah", "Kuantitas", "Harga"], tablefmt = "orgtbl"))
| Buah   |   Kuantitas |   Harga |
|--------+-------------+---------|
| Jeruk  |           1 |       4 |
| Nanas  |           2 |       3 |
| Mangga |           3 |         |

Apabila baris pertama digunakan sebagai header, banyak kolom akan sama dengan banyak elemen yang paling banyak di antara semua baris tabel. Penamaan kolom dimulai dari kanan.

Perhatikan contoh berikut.

table = [["Saya", 1, 4], ["Tampan", 2, 3, 5], ["Banget", 3, 5]]
print(tabulate(table, headers = "firstrow", tablefmt = "orgtbl"))
|        |   Saya |   1 |   4 |
|--------+--------+-----+-----|
| Tampan |      2 |   3 |   5 |
| Banget |      3 |   5 |     |

Tabulate sangat berguna untuk membentuk tabel secara “otomatis” atau secara pemrograman. Misalnya, kita bisa memanfaatkan looping dan pernyataan kondisional untuk membuat beberapa baris yang mengikuti pola dan syarat tertentu.

Sebagai contoh, misalnya kita punya function yang menghitung bilangan kuadrat ke-i

def kuadrat(i):
    return i**2
print(kuadrat(5))
25

Kita bisa membuat tabel, misalnya, yang menjabarkan bilangan kuadrat ke-1 sampai ke-5. Perhatikan struktur tabel apabila dibuat secara manual:

tabel_kuadrat = [
    [1, 1],
    [2, 4],
    [3, 9],
    [4, 16],
    [5, 15]
]
print(tabulate(tabel_kuadrat, headers=["i", "kuadrat"]))
  i    kuadrat
---  ---------
  1          1
  2          4
  3          9
  4         16
  5         15

Terlihat bahwa tabel tersebut memiliki lima baris, dan tiap baris berupa list yang merupakan elemen dari list besar tabel_kuadrat. Kita bisa membuatnya secara “otomatis” atau secara pemrograman:

tabel_mentah = []
for i in range(1, 6): # mulai dari 1, lanjut selama kurang dari 6
    calon_baris = [i, kuadrat(i)] # baris baru
    tabel_mentah.append(calon_baris) # menambahkan baris baru ke list besar

print(tabulate(tabel_mentah, headers=["i", "kuadrat"]))
  i    kuadrat
---  ---------
  1          1
  2          4
  3          9
  4         16
  5         25

Tentu saja, calon_baris tidak harus langsung jadi ketika baru didefinisikan. Tiap bagian dari suatu baris bisa saja ditambahkan secara berangsur-angsur:

tabel_mentah = []
for i in range(1, 6): # mulai dari 1, lanjut selama kurang dari 6
    calon_baris = [] # baris baru
    calon_baris.append(i) # bagian pertama pada baris

    # bagian kedua pada baris
    nilai_kedua = kuadrat(i)
    calon_baris.append(nilai_kedua)

    tabel_mentah.append(calon_baris) # menambahkan baris baru ke list besar

print(tabulate(tabel_mentah, headers=["i", "kuadrat"]))
  i    kuadrat
---  ---------
  1          1
  2          4
  3          9
  4         16
  5         25

Adanya lebih dari dua kolom juga sangat memungkinkan, tinggal ditambahkan ke calon_baris:

tabel_mentah = []
for i in range(1, 6): # mulai dari 1, lanjut selama kurang dari 6
    calon_baris = [] # baris baru

    # bagian pertama pada baris
    calon_baris.append(i)

    # bagian kedua pada baris
    nilai_kedua = kuadrat(i)
    calon_baris.append(nilai_kedua)

    # bagian ketiga
    calon_baris.append(i**3)

    # bagian keempat
    calon_baris.append(i**4)

    tabel_mentah.append(calon_baris) # menambahkan baris baru ke list besar

print(tabulate(tabel_mentah, headers=["i", "kuadrat", "pangkat tiga","pangkat empat"]))
  i    kuadrat    pangkat tiga    pangkat empat
---  ---------  --------------  ---------------
  1          1               1                1
  2          4               8               16
  3          9              27               81
  4         16              64              256
  5         25             125              625

Apabila kita sudah memiliki data tiap kolom dalam bentuk list, kita bisa membentuk calon_baris pada tiap iterasi for loop dengan mengakses elemen ke-i dari tiap list.

# misalnya data ini sudah ada, atau sudah diolah sebelumnya
kolom_awal = [1, 2, 3, 4, 5]
kolom_kuadrat = [1, 4, 9, 16, 25]
kolom_tiga = [1, 8, 27, 64, 125]
kolom_empat = [1, 16, 81, 256, 625]

# mari kita buat tabel
tabel_mentah = []
for i in range(0, 5): # indeks list dimulai dari nol, lanjut selama i < 5
    calon_baris = []

    # elemen ke-i dari tiap list kolom
    calon_baris.append(kolom_awal[i])
    calon_baris.append(kolom_kuadrat[i])
    calon_baris.append(kolom_tiga[i])
    calon_baris.append(kolom_empat[i])

    tabel_mentah.append(calon_baris)

print(tabulate(tabel_mentah, headers=["i", "kuadrat", "pangkat tiga","pangkat empat"]))
  i    kuadrat    pangkat tiga    pangkat empat
---  ---------  --------------  ---------------
  1          1               1                1
  2          4               8               16
  3          9              27               81
  4         16              64              256
  5         25             125              625

Bagaimana kalau misalnya ada data yang tidak lengkap? Kita bisa saja menggunakan try-except, untuk memasukkan “X” ketika ada data yang tidak lengkap, sekaligus menghindari error:

# contoh data
kolom_awal = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
kolom_kuadrat = [1, 4, 9, 16, 25]

tabel_mentah = []
for i in range(0, 10): # indeks list dimulai dari nol, lanjut selama i < 10
    calon_baris = []

    # elemen ke-i dari tiap list kolom
    calon_baris.append(kolom_awal[i])
    
    try:
        calon_baris.append(kolom_kuadrat[i])
    except IndexError:
        calon_baris.append("X")

    tabel_mentah.append(calon_baris)

print(tabulate(tabel_mentah, headers=["i", "kuadrat", "pangkat tiga","pangkat empat"]))
  i  kuadrat
---  ---------
  1  1
  2  4
  3  9
  4  16
  5  25
  6  X
  7  X
  8  X
  9  X
 10  X

NumPy juga memiliki semacam tipe data atau nilai yang standar untuk menandakan data yang hilang atau tidak tersedia, yaitu NaN (Not a Number), melalui numpy.nan

# contoh data
kolom_awal = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
kolom_kuadrat = [1, 4, 9, 16, 25]

tabel_mentah = []
for i in range(0, 10): # indeks list dimulai dari nol, lanjut selama i < 10
    calon_baris = []

    # elemen ke-i dari tiap list kolom
    calon_baris.append(kolom_awal[i])
    
    try:
        calon_baris.append(kolom_kuadrat[i])
    except IndexError:
        calon_baris.append(np.nan)

    tabel_mentah.append(calon_baris)

print(tabulate(tabel_mentah, headers=["i", "kuadrat", "pangkat tiga","pangkat empat"]))
  i    kuadrat
---  ---------
  1          1
  2          4
  3          9
  4         16
  5         25
  6        nan
  7        nan
  8        nan
  9        nan
 10        nan

Bagaimana kalau misalnya kita sudah punya suatu fungsi yang melakukan perhitungan secara iteratif dan hanya menampilkan hasil akhirnya, tetapi kita ingin memperoleh tiap hasil iterasi, bukan hasil akhirnya saja? Contohnya, fungsi menghitung faktorial \(n! = n * (n-1) * \dots * 3 * 2 * 1\) berikut ini,

def faktorial(n):
    
    # nilai awal
    hasil = 1

    # iterasi
    for i in range(2, n+1):
        # mulai dari 2, lanjut selama i < n + 1
        # sehingga iterasi terakhir adalah untuk i = n

        hasil = hasil * i
    
    # mengembalikan hasil akhir setelah semua iterasi selesai
    return hasil

# peroleh hasil akhir dari fungsi faktorial, kemudian print
print(faktorial(5))
120

Kita bisa saja melakukan print (di dalam fungsinya) tiap kali nilai hasil diperbarui.

def faktorial(n):
    
    # nilai awal
    hasil = 1
    print(hasil) # tampilkan hasil

    # iterasi
    for i in range(2, n+1):
        # mulai dari 2, lanjut selama i < n + 1
        # sehingga iterasi terakhir adalah untuk i = n

        hasil = hasil * i
        print(hasil) # tampilkan hasil yang baru
    
    # tidak perlu return karena sudah menggunakan print

# fungsi cukup dipanggil saja,
# karena print sudah ada di dalam fungsi
faktorial(5)
1
2
6
24
120

Alternatifnya, kita bisa memasukkan tiap hasil baru ke dalam suatu list, yang kemudian dikembalikan oleh fungsi, lalu kita bisa print list tersebut.

def ListFaktorial(n):
    list_baru = []
    
    # nilai awal
    hasil = 1
    list_baru.append(hasil) # tambahkan ke list

    # iterasi
    for i in range(2, n+1):
        # mulai dari 2, lanjut selama i < n + 1
        # sehingga iterasi terakhir adalah untuk i = n

        hasil = hasil * i
        list_baru.append(hasil) # tambahkan tiap hasil baru ke list
    
    # kembalikan list semua hasil
    return list_baru

# peroleh list dari fungsi di atas, kemudian print
print(ListFaktorial(5))
[1, 2, 6, 24, 120]

Bahkan, list ini bisa diubah menjadi tabel!

def ListFaktorial(n):
    list_baru = []
    
    # nilai awal
    hasil = 1
    list_baru.append(hasil) # tambahkan ke list

    # iterasi
    for i in range(2, n+1):
        # mulai dari 2, lanjut selama i < n + 1
        # sehingga iterasi terakhir adalah untuk i = n

        hasil = hasil * i
        list_baru.append(hasil) # tambahkan tiap hasil baru ke list
    
    # kembalikan list semua hasil
    return list_baru

# kolom nilai i
kolom_kiri = [1, 2, 3, 4, 5]
# bisa juga dibuat dengan for loop dengan range(1,6) append i

# peroleh list dari fungsi di atas
kolom_kanan = ListFaktorial(5)

# "gabung" kedua kolom menjadi satu tabel, seperti biasa
tabel_mentah = []
for i in range(0,5):
    calon_baris = []
    calon_baris.append(kolom_kiri[i])
    calon_baris.append(kolom_kanan[i])
    tabel_mentah.append(calon_baris)

tabel_olahan = tabulate(tabel_mentah, headers=["i", "faktorial"])
print(tabel_olahan)
  i    faktorial
---  -----------
  1            1
  2            2
  3            6
  4           24
  5          120

Perhatikan bahwa kita memerlukan dua list untuk membentuk tabel di atas. Bisa saja, kita membentuk kedua list sepenuhnya di dalam fungsi. Dengan begitu, setelah menggunakan fungsi, kita tinggal membentuk tabel dari kedua list.

def DuaListFaktorial(n):
    kolom_kiri = [] # berisi i
    kolom_kanan = [] # berisi faktorial atau i!
    
    # nilai awal
    hasil = 1

    # tambahkan ke list
    kolom_kiri.append(1)
    kolom_kanan.append(hasil)

    # iterasi
    for i in range(2, n+1):
        # mulai dari 2, lanjut selama i < n + 1
        # sehingga iterasi terakhir adalah untuk i = n

        hasil = hasil * i

        # tambahkan tiap hasil baru ke list
        kolom_kiri.append(i)
        kolom_kanan.append(hasil)
    
    # kembalikan kedua list
    return kolom_kiri, kolom_kanan

# peroleh kedua list dari fungsi
kolom_kiri, kolom_kanan = DuaListFaktorial(5)

# "gabung" kedua kolom menjadi satu tabel, seperti biasa
tabel_mentah = []
for i in range(0,5):
    calon_baris = []
    calon_baris.append(kolom_kiri[i])
    calon_baris.append(kolom_kanan[i])
    tabel_mentah.append(calon_baris)

tabel_olahan = tabulate(tabel_mentah, headers=["i", "faktorial"])
print(tabel_olahan)
  i    faktorial
---  -----------
  1            1
  2            2
  3            6
  4           24
  5          120

Kalau mau, bahkan proses pembentukan tabel juga bisa dilakkukan di dalam fungsi, sehingga fungsi memberikan output berupa tabel yang siap diolah tabulate.

def TabelFaktorial(n):
    kolom_kiri = [] # berisi i
    kolom_kanan = [] # berisi faktorial atau i!
    
    # nilai awal
    hasil = 1

    # tambahkan ke list
    kolom_kiri.append(1)
    kolom_kanan.append(hasil)

    # iterasi
    for i in range(2, n+1):
        # mulai dari 2, lanjut selama i < n + 1
        # sehingga iterasi terakhir adalah untuk i = n

        hasil = hasil * i

        # tambahkan tiap hasil baru ke list
        kolom_kiri.append(i)
        kolom_kanan.append(hasil)
    
    tabel_mentah = []
    for i in range(0,n):
        # sampai indeks (n-1)
        # nilai n tergantung banyaknya iterasi

        calon_baris = []
        calon_baris.append(kolom_kiri[i])
        calon_baris.append(kolom_kanan[i])
        tabel_mentah.append(calon_baris)
    
    return tabel_mentah

tabel_mentah = TabelFaktorial(5)

tabel_olahan = tabulate(tabel_mentah, headers=["i", "faktorial"])
print(tabel_olahan)
  i    faktorial
---  -----------
  1            1
  2            2
  3            6
  4           24
  5          120

Bahkan, pengolahan tabel bisa dilakukan di dalam fungsi…

def TabelFaktorial(n):
    kolom_kiri = [] # berisi i
    kolom_kanan = [] # berisi faktorial atau i!
    
    # nilai awal
    hasil = 1

    # tambahkan ke list
    kolom_kiri.append(1)
    kolom_kanan.append(hasil)

    # iterasi
    for i in range(2, n+1):
        # mulai dari 2, lanjut selama i < n + 1
        # sehingga iterasi terakhir adalah untuk i = n

        hasil = hasil * i

        # tambahkan tiap hasil baru ke list
        kolom_kiri.append(i)
        kolom_kanan.append(hasil)
    
    tabel_mentah = []
    for i in range(0,n):
        # sampai indeks (n-1)
        # nilai n tergantung banyaknya iterasi

        calon_baris = []
        calon_baris.append(kolom_kiri[i])
        calon_baris.append(kolom_kanan[i])
        tabel_mentah.append(calon_baris)
    
    # mengolah tabel di dalam fungsi
    tabel_olahan = tabulate(tabel_mentah, headers=["i", "faktorial"])
    return tabel_olahan

tabel_jadi = TabelFaktorial(5)
print(tabel_jadi)
  i    faktorial
---  -----------
  1            1
  2            2
  3            6
  4           24
  5          120

Tentu saja, nilai 5 itu selalu bisa diganti menjadi sembarang bilangan bulat positif, seperti 7, 10, 15, 22, atau bahkan lebih besar lagi, dan banyaknya baris akan menyesuaikan, karena pembentukan tabel dilakukan secara otomatis.

tabel_jadi = TabelFaktorial(22)
print(tabel_jadi)
  i               faktorial
---  ----------------------
  1                       1
  2                       2
  3                       6
  4                      24
  5                     120
  6                     720
  7                    5040
  8                   40320
  9                  362880
 10                 3628800
 11                39916800
 12               479001600
 13              6227020800
 14             87178291200
 15           1307674368000
 16          20922789888000
 17         355687428096000
 18        6402373705728000
 19      121645100408832000
 20     2432902008176640000
 21    51090942171709440000
 22  1124000727777607680000