Python NumPy Kullanımı, Sayısal Matrisler ve Yapay Zeka Mimarisine İlk Adım

“Python NumPy ile Yapay Zeka Tasarımı” başlığı çok iddialı oldu sanırım. Aslında “NumPy ile Yapay Zeka Tasarımına Giriş” daha anlamlı bir başlık olurdu. Öyle yada böyle bir yerden başlamak lazım AI tasarımına.
Python ile çalışırken büyük verilerin ayrıştırılmasında (bigdata), görüntü işleme ve hatta yapay zeka mimarisine kadar bir çok alanda matematiksel matrislerin kullanıldığına şahit oluyoruz. Python’da sayı matrislerini işleyen bir çok kütüphane ve sınıf bulunuyor. Bunlardan en çok kullanılanı şüphesiz NumPy kütüphanesidir. Python NumPy kütüphanesi ile neler yapabileceğimize dair bir giriş yapalım.
NumPy Kütüphanesi BootCamp Projesinin GitHub Bağlantısı:
https://github.com/omersahintr/BootCampEdu/tree/main/NumPy
Index
NumPy Kütüphanesi Kurulumu
Python NumPy ile çalışabilmek için öncelikle kurulumunu gerçekleştirmemiz gerekir. Kurulum işleminden sonra import ederek kod satırında NumPy kütüphanesinden yararlanabiliriz.
Terminal ekranına geçelim ve aşağıdaki komut satırını yazarak NumPy modülünü yükleyelim:
- pip install numpy (Python çekirdek platformu için)
- conda install numpy (Anaconda platformu için)

NumPy Dökümantasyonu: https://numpy.org/doc/stable/
NumPy kütüphanesini diğer kütüphaneler içerisinde de bol bol kullanacaksınız. Özellikle matris ve determinant varsa NumPy yardımınıza yetişecektir.
Python Liste Değişkenini NumPy Dizi Değişkenine Çevirme
Aşağıdaki kod satırında bir liste değişkeni numpy dizi değişkenine çevrilmiş ve ekrana yazdırılmıştır. Ekran çıktıları açıklama satırı olarak “# : “sembolü ile eklenmiştir.
import numpy as np
my_list = [10,20,30,40,50] #python list variable
my_array = np.array(my_list) #list variable convert to numpy array type
print(type(my_list)) # : <class 'list'>
print(type(my_array)) # : <class 'numpy.ndarray'>
print(my_array) # : [10 20 30 40 50]
print(my_array[0]) # : 10
print(my_array[-2]) # : 40
my_array[1] = 200
print(my_array) # : [ 10 200 30 40 50]
print(my_array.max()) # : 200 maximum value
print(my_array.min()) # : 10 minimum value
print(my_array.mean()) # : 66.0 average value
list_python = [[1,0,0],[0,1,0],[0,0,1],[0,0,0]] # python list variable
print(list_python[1][1]) # : 1
## Np Matrix
np_matrix = np.array(list_python) # NumPy matrix variable
print(np_matrix) # :
# [1 0 0]
# [0 1 0]
# [0 0 1]
# [0 0 0]
print(np_matrix[0]) # : [1,0,0]
print(np_matrix[0][0]) # : 1
print(np_matrix.shape) # : (4,3) array size 4-rows and 3-columns
## Arrange ##
new_matrix = np.arange(0,10) # : [0 1 2 3 4 5 6 7 8 9]
new_matrix = np.arange(0,100,10) # : [ 0 10 20 30 40 50 60 70 80 90]
print(new_matrix)
print(np.zeros((3,3)))
# : [0. 0. 0.]
# [0. 0. 0.]
# [0. 0. 0.]
print(np.ones((4,3)))
#: [1. 1. 1. 1.]
# [1. 1. 1. 1.]
# [1. 1. 1. 1.]
# [1. 1. 1. 1.]
## linspace:
print(np.linspace(0,10,10))
# [ 0. 1.11111111 2.22222222 3.33333333 4.44444444 5.55555556
# 6.66666667 7.77777778 8.88888889 10. ]
## random:
print(np.random.randint(1,100,5)) # : [75 82 83 26 56] 1 to 100 random 5 numbers
Python- np.array(list): dizi değişkeni numpy matris değişken türüne çevirir.
- np_matrix[i][j]: i-satır indeksi ve j-sütun indeksi
- np_matrix.shape: matrisin boyutunu verir (rows, cols)
Np.zeros(i,j) ve Np.ones(i,j) ile Matris Oluşturma
np.zeros(3,3) | [0. 0. 0.] [0. 0. 0.] [0. 0. 0.] | 3×3 boyutunda 0-sıfır matrisi oluştur. |
np.ones(4,3) | [1. 1. 1.] [1. 1. 1.] [1. 1. 1.] [1. 1. 1.] | 4×3 boyutunda 1-birler matrisi oluştur. |
Np.linespace(start,stop,num) ve Np.random.randint(low,high,size) ile Matris Oluşturma
np.linespace(0,10,10) | [ 0. 1.11111111 2.22222222 3.33333333 4.44444444 5.55555556 # 6.66666667 7.77777778 8.88888889 10. ] | 0’dan 10’a kadar belirli arlıklarla lineer sayılar oluştur |
np.random.randint(1,100,5) | [87 70 31 45 73] | 1’den 100’e kadar 5 adet rasgele tam sayı üret. |
NumPy ile Slicing (Dilimleme) İşlemleri
import numpy as np
np_array = np.arange(0,10) # : [0 1 2 3 4 5 6 7 8 9]
print(np_array)
## Slicing
print(np_array[2:6]) # : [2 3 4 5 ]
print(np_array[0:10:2]) # : [0 2 4 6 8]
np_array[2:5] = -1 # : [ 0 1 -1 -1 -1 5 6 7 8 9]
print(np_array)
Python- np_array olarak tanımlanan diziden parça almak için np_array[başlangıç_indeks, bitiş_indeks, adım] şeklinde yazılabilir.
- np_array[i:j:x] = -1 ile herhangi bir değer atanabilir. Bu atama işlemini listelerde yapamıyorduk.
Python NumPy Dizilerde Slicing ile Etkilenen Diziler Oluşturalım
- np.arange(0,10) ile bir np dizi oluşturalım.
- np_array değişkenin içinde [0 1 2 3 4 5 6 7 8 9] olacaktır.
- mid_array = np_array[3:7] ile bu dizi içerisinden bir parça alıp yeni bir değişkene atayalım.
- mid_array[:] = 10 ile bu yeni dizinin tüm elemanlarını 10 yapalım.
- print[mid_array] –> [10 10 10 10] olacaktır.
- Ancak işin ilginç yanı
print(np_array) –> [ 0 1 -1 10 10 10 10 7 8 9] ilk tanımlanan diziye bir değer ataması yapmadığımız halde 3 ve 7’nci indeksler arasındaki sayılarda 10 olarak değiştirilmiş.
Bu slicing – dilimleme metodu sadece NumPy dizilerinde bu şekilde çalışmaktadır. Python standart liste yapısında slicing ile toplu veri atama yapılamaz. Tek tek değiştirilebilir ancak yine de parça alınan ana listedeki elemanlar değişmezler.
Bu slicing metodundan kurtulmak için diziyi farklı şekilde dilimlememiz gerekiyor.
- np_copy_array = np_array.copy() ile bağımsız kopya bir dizi oluşturup buradan slicing ile bir parça alıp değer atanırsa np_array içerisindeki hiçbir veri değişmeyecektir.
import numpy as np
# Slicing Copy Arrays Method
a_array = np.arange(0,10) # : [0 1 2 3 4 5 6 7 8 9] --> [0 1 2 3 4 5 6 7 8 9]
b_array = a_array.copy() # : [0 1 2 3 4 5 6 7 8 9] --> [0 1 2 3 99 99 99 99 99 9]
c_array = b_array[4:9] # : [4 5 6 7 8]
c_array[:] = 99 # : [99 99 99 99 99]
print(f"a_array={a_array}\nb_array={b_array}\nc_array={c_array}")
Python
NumPy Dizi İşlemleri
import numpy as np
x_array = np.random.randint(1,100,20)
final_array = x_array > 50 # : [ True True True True False False True False True True False False
# False False False True False False False True]
print((x_array[final_array])) # : >50 listing --> [58 66 56 93 62 67 98 56 77 93 52 61]
Pythonbüyüktür (>), küçüktür (<), eşittir (=) veya eşit değildir(!=) operatörlerini numpy dizilerinde bu şekilde kullanabilirsiniz.
Hatta burada final_array adlı diziyi oluşturmadan da 1 satır kısaltarak yazabiliriz.
import numpy as np
x_array = np.random.randint(1,100,20)
print(x_array[x_array > 50]) # : >50 listing --> [58 66 56 93 62 67 98 56 77 93 52 61]
PythonNumPy Dizilerde Matematiksel İşlemler
Toplama, Çıkarma, Bölme ve Çarpma (Dört İşlem)
Standart python dizilerinden yapı itibariyle oldukça gelişmiş olan NumPy dizilerini birbiri ile toplama, çıkarma, çarpma ve bölme işlemi yapabilirsiniz. NumPy bu işlemleri index bazlı yapmaktadır.
import numpy as np
end_array = np.arange(1,10)
print(end_array) # : [1 2 3 4 5 6 7 8 9]
print(end_array + end_array) # : [ 2 4 6 8 10 12 14 16 18]
print(end_array - end_array) # : [0 0 0 0 0 0 0 0 0]
print(end_array * end_array) # : [ 1 4 9 16 25 36 49 64 81]
print(end_array / end_array) # : [1. 1. 1. 1. 1. 1. 1. 1. 1.]
PythonPython NumPy dizileri ile matematiksel 4 işlem yaparken dikkat etmeniz gereken nokta iki dizinin boyutları (eleman sayısı) aynı olmalıdır.
Örneğin;
import numpy as np
end_array = np.arange(1,10)
and_array = np.arange(2,8)
print(end_array + end_array)
Pythonşeklinde iki farklı boyuttaki numpy dizisini toplamaya çalışırsanız, ValueError: operands could not be broadcast together with shapes (9,) (6,) hatası alırsınız. Özetle birinci dizi 9 elemanlı ve ikinci dizi 6 elemanlı bunları toplayamam diyor.
Max(), Min(), Mean(), Sqrt() Metodları
Numpy dizisindeki elemanların en büyük, en küçük ve ortalamasını alan metodlar.
Bu işlemleri iki farklı yöntemle uygulayabilirsiniz;
- this_array.max() veya np.max(this_array) her ikisi de aynı sonucu döndürür. Ancak yaygın kullanım np.max(this_array) şeklindedir.
import numpy as np
this_array = np.arange(1,10)
print(this_array.max()) # : 9
print(np.max(this_array)) # : 9
print(this_array.min()) # : 1
print(this_array.mean()) # : 5.0
print(np.sqrt(this_array[2])) # : 1.7320508075688772 karekök
Python