Kısa NumPy Alıştırmaları

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)) # 
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.

Bir Cevap Yazın