Wednesday, 18 March 2015

3.4.1.Multidimensi array

Feature yang lain dari python adalah multidimensi array. Bentuknya seperti matrix, array ini bisa kita bikin sebanyak kita suka.
  • >>> matrik=[['a','b','c'], 
              [1,2,3], 
              ['a1','b1','c1']] 
  • >>> matrik 
              [['a', 'b', 'c'], [1, 2, 3], ['a1', 'b1', 'c1']]
  • >>> 
penulisannya tidak harus seperti diatas, penulisan diatas dimaksudkan agar membacanya matrix menjadi mudah. kita bisa menulikannya dalam satu baris.

Disini kita memiliki matrix 3x3, 
Pada baris pertama kita memiliki    'a',     'b',     'c'
Pada baris kedua kita memiliki        1,      2,       3
dan pada baris ketiga                     'a1',   'b1',   'c1'

Index012
0abc
1123
2a1b1c1

Bila kita ingin memanggil string 'a1' yang berada di baris ke-1 dan kolom ke-3, kita lihat index matrik tersebut, 'a1' ada di baris index 2 dan colom index 0:
  • >>> matrik[2][0] 
  • 'a1'
  • >>> 
Untuk membuat string dari misalnya kolom 0 yang isinya ['a',1,'a1'], kita tinggal tulis:
  • >>> kolom0=[ row[0] for row in matrik ] 
  • >>> kolom0
  • ['a', 1, 'a1']
  • >>> 
apa yang terjadi diatas? kita membuat string bernama kolom0 dan diisi dengan string.matrik pada setiap baris yang pertama. dengan kata lain "berikan baris(0) untuk setiap baris pada matrik":
  • >>> matrik[0][0] 
  • 'a'
  • >>> matrik[1][0] 
  • 1
  • >>> matrik[2][0] 
  • 'a1'
Buat lagi matrik baru, isinya rr=[ [1,2,3],[4,5,6],[7,8,9] ]
di matrik ini isi nya

     1    2    3
     4    5    6
     7    8    9

Nah kita menginginkan untuk array yang baru (oo),angka pada setiap baris kolom ke-2 (indek 1) lalu ditambahkan 5.  Gambaranya seperti ini:


k1
k2
k3
b1
1
2+5
3
b2
4
5+5
6
b3
7
8+5
9
  • >>> rr=[ [1,2,3],[4,5,6],[7,8,9] ] 
  • >>> oo=[row[1]+5 for row in rr] 
  • >>> oo 
  • [7, 10, 13]
  • >>> 
pada contoh diatas masi mirip contoh sebelumnya, mengambil pada setiap baris pada kolom ke 2 (index 1) lalu ditambahkan 5.
Dan bila kita mau mengambil angka pada setiap baris, pada kolom pertama (index 0) dah bila dibagi 2 habis, tidak ada desimal.
  • >>> [row[0] for row in rr if row[0]%2==0] 
  • [4]
  • >>> 
Tanda % adalah modulus, fungsinya bila kita membagi suatu angka dengan angka lain, sisa hasil bagi merupakan modulus. contoh 3 / 2 = 1 mod 1

                        1       
                   2 |  3
                         2    -
                         1  → ini adalah modular (jadi hasilnya 1 mod 1)


Kita masih latihan array / matrik, sekarang kita akan mengambil angka-angka secara diagonal seperti 1,5,9. berarti kita memerlukan koordinat baris dan kolomnya bukan?. Koordinat yang kita perlukan adalah indek (0,0) lalu (1,1) dan (2,2) , disini ada looping (yang belum kita bahas, tapi kita tetap membahasnya hehehe... ), disini index baris dan kolomnya selalu sama bukan? ketika index baris 0 maka index kolom juga 0, dst.
  • >>> [ rr[i][i] for i in [0,1,2] ] 
  • [1, 5, 9]
  • >>> 
Ya, sepertinya anda bingung. jadi setiap baris kita mengambil array dari angka i, dan harga i adalah 0,1, dan 2. Untuk baris yang pertama, i yang digunakan adalah 0, jadi rr[0][0],
baris kedua, i yang digunakan adalah 1, jadi rr[1][1],
dan baris ketiga, i-nya adalah 2, jadi rr[2][2].
  • >>> rr[0][0] 
  • 1
  • >>> rr[1][1] 
  • 5
  • >>> rr[2][2] 
  • 9
  • >>> kk=[ r*2  for  r  in  'halo' ] 
  • >>> kk 
  • ['hh', 'aa', 'll', 'oo']
  • >>> 
pada contoh diatas string kk, terjemahannya seperti ini, " kalikan 'r' dengan 2, untuk r adalah 'halo'", sehingga setiap karakter pada 'halo' dicetak dua kali.

Bisa juga kita menbuat list yang mempunyai pola-pola tertentu tanpa repot membuatnya satu-satu seperti 0,1,2,3,4,5,6,...,100. Kita tinggal buat saja:
  • >>> list(range(101)) 
  • [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100]
  • >>> 
Nah untuk memulai dari angka 1 sampai 100:
  • >>> list(range(1,101)) 
  • [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100]
  • >>> 
diatas ( list(range(1,101)) ) angka 1 pada (1,101) merupakan awal dari list dan 101 adalah akhir dan berhenti di angka 101 (angka 101 adalah titik berhenti menghitung dan tidak dicetak).

Bila kita memerlukan suatu baris deret yang berpola seperti 2,4,6...
  • >>> list(range(2,101,2)) 
  • [2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100]
  • >>> 
Dan untuk semua angka yang habis di bagi 2 antara 1 sampai 100:
  • >>> [ x for x in range( 1, 101) if  x % 2 == 0 ] 
  • [2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100]
  • >>> [ [ x ] for x in range (1, 101) if x % 2 == 0 if x > 50 ]
  • [[52], [54], [56], [58], [60], [62], [64], [66], [68], [70], [72], [74], [76], [78], [80], [82], [84], [86], [88], [90], [92], [94], [96], [98], [100]]
  • >>> 
Untuk array 2 dimensinya :
  • >>> [ [ x*2 , x+2 ] for x in range ( 10 ) ] 
  • [[0, 2], [2, 3], [4, 4], [6, 5], [8, 6], [10, 7], [12, 8], [14, 9], [16, 10], [18, 11]]
  • >>>  [ [ x*2, x+2 ] for x in range( 1, 101, 2 ) if x > 50 ] 
  • [[102, 53], [106, 55], [110, 57], [114, 59], [118, 61], [122, 63], [126, 65], [130, 67], [134, 69], [138, 71], [142, 73], [146, 75], [150, 77], [154, 79], [158, 81], [162, 83], [166, 85], [170, 87], [174, 89], [178, 91], [182, 93], [186, 95], [190, 97], [194, 99], [198, 101]]
  • >>> 
Pastinya kita bertanya-tanya "koq bisa begitu ya?", ya begitulah, karena kita belum dapat semua basic dari python, sehingga kita harus menggunakan metode hacker, yang sistimatis dan "trial and error" cari pattern syntax yang benar, pastinya dari 10 kali kita coba, belum tentu ada 1 yang benar untuk saat ini. Cobalah beberapa variasi baru yang mirip-mirip dengan contoh, dan cobalah variasi yang lebih komplek dari percobaan sebelumnya. Ya kira-kira begitulah kerjaanya hecker (hecker itu bukan orang-orang yang berbuat kriminal, tapi orang-orang yang mencoba untuk mengubah sesuatu yang ada pada software atau pun hardware dimana sebuah ide bisa disusupkan kedalam ide yang lain, dan menjadi terkenal karena kriminalnya hehehe....).

Selanjutnya, kita menggunakan penjumlahan 'sum()' untuk menjumlahkan matrik rr tiap baris:
  • >>> hh=[sum(row) for row in rr] 
  • >>> hh
  • [6, 15, 24]
  • >>> 
dan satu lagi:
  • >>> hh=(sum(row) for row in rr) 
  • >>> next(hh) 
  • 6
  • >>> next(hh) 
  • 15
  • >>> next(hh) 
  • 24

Yang pake next-next an itu namanya 'map' yang bekerja oleh fungsi, hanya satu yang dikerjakan dan berdasarkan panggilan,  apa isinya hh? 
  • >>> hh 
  • <generator object <genexpr> at 0x0000000003516F30>
  • >>> 
Sepertinya hanya sebuah alamat memory. Ini dikarenakan semua angka berkerja melalui fungsi. Jadi hh sekarang adalah bagian dari fungsi yang beralamat di 0x0000000003516F30 di memory. Apa ini penting? tidak penting, tidak masalah alamatnya dimana yang penting bisa jalan programnya. 
  • >>> list(map(sum, rr)) 
  • [6, 15, 24]
  • >>> 
Diatas adalah map yang dipaksa jadi list.  

No comments:

Post a Comment