NumPy; Python kullanılan bilimsel projelerde kullanılmak üzere tasarlanmış, çok boyutlu dizilerde hesaplamalar yapabileceğimiz bir pakettir.
Öncelikle kullanabilmek için paketi kodumuza dahil ederek başlıyoruz.
import numpy as np Tek boyutlu bir dizi örneği; dizi = np.array([1, 2, 3]) print(type(dizi)) # <type 'numpy.ndarray'> print(dizi.shape) # (3,) # dizilerin indexi sıfırdan başladığı için # ikinci elemana ulaşmak için 1 nolu indexi çağırıyoruz. print(dizi[1]) # 2 dizi[1] = 4 print(dizi[1]) # 4
shape; dizimizdeki boyut sayısı kadar elemanı olan bir tuple döndürür, dizi hakkındaki en temel ve en gerekli bilgidir. Bu tuple içindeki değerler ise hangi boyutta kaç adet değerimiz olduğudur. Yukarıdaki örnekte, tek boyutlu ve u boyutta 3 değeri olan dizi için (3,) şeklinde bir tuple dönüyor.
İki boyutlu bir dizi örneği;
dizi = np.array([[1,2,3],[4,5,6]]) print(dizi.shape) # (2,3) print(dizi[0,0]) # 1 print(dizi[1,0]) # 4 print(dizi[1,2]) # 6
Boyut sayısı bu şekilde istediğimiz kadar arttırılabilir.
Yeni bir dizi oluşturmak için np.array metodundan başka pek çok yöntem sunar numpy
# 2 boyutlu ve ikişer elemanlı değerleri sıfır olan bir dizi üretir sifir = np.zeros((2,2)) print(sifir) # [[ 0. 0.] # [ 0. 0.]] # zeros metoduna benzer şekilde birler ile dolu bir dizi döner bir = np.ones((3,3)) print(bir) # [[ 1., 1., 1.], # [ 1., 1., 1.], # [ 1., 1., 1.]] # sıfır ve birden başka bir sayıya ihtiyacımız olduğunda ise np.full() yardımcı olacaktır sekiz = np.full((2,2), 8) print(sekiz) # [[8, 8], # [8, 8]] # köşegeninde birler olan bir dizi için diagonal = np.eye(2) print(diagonal) # [[ 1., 0.], # [ 0., 1.]] # rastgele değerler içeren bir dizi için rastgele = np.random.random((2,2)) print(rastgele) # [[ 0.82426947, 0.39819465], # [ 0.40478582, 0.49829286]]
Dilimleme (slicing)
dizi = np.array([[1,2,3,4], [5,6,7,8], [9,10,11,12]]) # Birinci boyuttan sıfırıncı elemanı ve # İkinci boyuttan 1den 3e kadar yani 1. ve 2. elemanları # alarak yeni bir alt-dizi oluşturalım print(dizi[:1, 1:3]) # [[2, 3]] print(dizi[:2, 1:2]) # [[2], # [6]] # Dilim olarak alınan bu parça ana dizinin bir parçasının görüntüsü # olduğundan alt-dizi üzerinde yapılan değişiklikler ana diziyi de etkileyecektir.
Şu iki dilimin aynı elemanları olmasına rağmen boyutlarının farklı olduğuna da dikkat edilmesi gerekir.
dizi = np.array([[1,2,3,4], [5,6,7,8], [9,10,11,12]]) print(dizi[0,:].shape) # (4,) print(dizi[:1,:].shape) # (1, 4) # İkinci dilime eş olarak şu şekilde de yazılabilir print(dizi[[0],:].shape) # (1, 4)
Dizinin elemanlarını bir koşula bağlı olarak aşağıdaki şekilde seçebiliriz.
dizi = np.array([[1,2], [3, 4], [5, 6]]) buyuk_dizi = (dizi > 3) print(buyuk_dizi) # [[False, False], # [False, True], # [ True, True]] # Koşulumuz 3'ten büyük elemanları bulur # Bu koşul ana dizimizle aynı boyutta içinde koşulu sağladığını gösteren # True ve False'lardan oluşan elemanlar döndürür print(dizi[buyuk_dizi]) # [4, 5, 6] # Daha kısa bir yol olarak print(dizi[dizi>3])
Dizilerle dört işlem; bu işlemler çapraz olarak eleman tabanlı yapılır, yani dönen sonuç yine bir dizidir.
Normal şartlarda Python’un döngülerde göreceli olarak yavaş olması büyük dizilerde elemanlar üzerine işlem yapmayı zorlaştırır. NumPy içinde tanımlı pek çok ufuncs(Universal Functions) ile bazı işlemlerde döngü kullanmak yerine çok daha hızlı olan bu metotları kullanabiliriz.
x = np.array([[1,2],[3,4]], dtype=np.float64) y = np.array([[5,6],[7,8]], dtype=np.float64) # dtype dizinin eleman tipini belirtmemize yarar, büyük dizilerde hafıza(memory,RAM) sorunları yaşamamak için optimize etmekte fayda var. print(x + y) print(np.add(x, y)) # iki işlem de aynı sonucu verecektir. # [[ 6., 8.], # [ 10., 12.]] print(x - y) print(np.subtract(x, y)) # [[-4., -4.], # [-4., -4.]] print(x * y) print(np.multiply(x, y)) # [[ 5., 12.], # [ 21., 32.]] print(x / y) print(np.divide(x, y)) # [[ 0.2 , 0.33333333], # [ 0.42857143, 0.5 ]] # her elemanın karekökünü alma np.sqrt(x) # [[ 1. , 1.41421356], # [ 1.73205081, 2. ]] # nokta çarpımı / dot product x.dot(y) # [[ 19., 22.], # [ 43., 50.]] # Bir dizi içindeki boyutların yerlerini değiştirmeye yarayan Transpose işlemi print(x.T) # [[ 1., 3.], # [ 2., 4.]]
Referans kaynak olarak şuraya bakabilirsiniz.