Dersler

View on GitHub

EEM-241 İleri Düzey Programlama

2024-2025 Güz Dönemi

Ders 10 - NumPy ile Sayısal Hesaplama

1. Kurulum ve içe aktarma

Gerekirse terminalde:

pip install numpy
import numpy as np

NumPy dizileri aynı türdeki çok sayıdaki veriyi hızlı ve belleği verimli biçimde işlemek için tasarlanmıştır.

python_listesi = [1, 2, 3]
dizi = np.array(python_listesi)

print(type(python_listesi))
print(type(dizi))

Liste ile dizi çarpımının farklı anlamlarına dikkat edin:

print([1, 2, 3] * 2)
print(np.array([1, 2, 3]) * 2)

2. Dizi oluşturma

vektor = np.array([1, 2, 3])
matris = np.array([[1, 2, 3], [4, 5, 6]])
print(np.arange(0, 11, 2))
print(np.linspace(0, 1, 5))
print(np.zeros(4))
print(np.ones((2, 3)))
print(np.full((2, 3), 7))
print(np.eye(3))

Tekrarlanabilir rastgele sayılar

rng = np.random.default_rng(seed=42)

print(rng.random((2, 3)))
print(rng.integers(1, 100, size=10))

Sabit seed, örneğin ve deneyin yeniden üretilebilmesini sağlar.

3. Dizinin yapısı ve veri türü

dizi = np.array([[1, 2, 3], [4, 5, 6]], dtype=np.float64)

print(dizi.shape)  # her eksendeki eleman sayısı
print(dizi.ndim)   # eksen/boyut sayısı
print(dizi.size)   # toplam eleman sayısı
print(dizi.dtype)  # elemanların veri türü

NumPy dizisindeki elemanlar ortak bir veri türüne dönüştürülür:

dizi = np.array([1, 2.5, 3])
print(dizi.dtype)

Tür dönüştürme yeni bir dizi üretir:

ondalikli = np.array([1.2, 2.8, 3.5])
tamsayi = ondalikli.astype(np.int32)
print(tamsayi)

4. İndeksleme ve dilimleme

dizi = np.arange(0, 11)

print(dizi[3])
print(dizi[-1])
print(dizi[2:6])
print(dizi[::2])

İki boyutlu dizilerde [satır, sütun] kullanımı tercih edilir:

matris = np.array([[5, 10, 15],
                   [20, 25, 30],
                   [35, 40, 45]])

print(matris[1, 0])
print(matris[:2, 1:])
print(matris[:, 0])

Görünüm ve kopya farkı

NumPy dilimleri çoğunlukla orijinal veriyi paylaşan bir görünüm oluşturur:

dizi = np.arange(10)
parca = dizi[0:4]
parca[:] = 99
print(dizi)

Bağımsız veri gerektiğinde açıkça kopya alınır:

dizi = np.arange(10)
parca = dizi[0:4].copy()
parca[:] = 99
print(dizi)

5. Yeniden şekillendirme

Toplam eleman sayısı korunmalıdır.

dizi = np.arange(24)
matris = dizi.reshape(4, 6)

print(matris)
print(matris.shape)

Boyutlardan biri -1 verilirse NumPy onu hesaplar:

dizi = np.arange(24)
print(dizi.reshape(3, -1))
print(dizi.reshape(-1, 1))

Çok boyutlu diziyi tek boyuta indirmek için:

print(matris.ravel())

6. Vektörleştirilmiş işlemler

Döngü yazmadan tüm elemanlara işlem uygulanabilir:

dizi = np.arange(1, 6)

print(dizi + 10)
print(dizi * 2)
print(dizi ** 2)
print(np.sqrt(dizi))
print(np.sin(dizi))

Eleman eleman işlemler için iki dizinin şekilleri uyumlu olmalıdır:

a = np.array([1, 2, 3])
b = np.array([10, 20, 30])

print(a + b)
print(a * b)

Sıfıra bölme gibi işlemlerde NumPy çoğunlukla uyarı üretip inf veya nan oluşturur. Bu değerler fark edilmeden kullanılmamalıdır.

7. Broadcasting

NumPy, uyumlu şekillerdeki küçük diziyi daha büyük dizi boyunca genişletir:

matris = np.array([[1, 2, 3],
                   [4, 5, 6]])
satir = np.array([10, 20, 30])

print(matris + satir)

Her sütunun ortalamasını çıkarma:

ortalama = matris.mean(axis=0)
merkezlenmis = matris - ortalama
print(merkezlenmis)

8. Boolean filtreleme

olcumler = np.array([12.1, 9.8, 15.4, 7.2, 11.5])
maske = olcumler > 10

print(maske)
print(olcumler[maske])
print(olcumler[olcumler > 10])

Birden fazla koşulda her koşul paranteze alınır ve &, |, ~ kullanılır:

print(olcumler[(olcumler >= 10) & (olcumler <= 13)])

9. Özetleme ve axis

matris = np.array([[1, 2, 3],
                   [4, 5, 6]])

print(matris.sum())
print(matris.sum(axis=0))  # satırlar boyunca: sütun sonuçları
print(matris.sum(axis=1))  # sütunlar boyunca: satır sonuçları
print(matris.mean(axis=0))
print(matris.min(), matris.argmin())
print(matris.max(), matris.argmax())

Mühendislik verilerinde sık kullanılan diğer fonksiyonlar:

print(np.median(matris))
print(np.std(matris))

10. Matris çarpımı ve doğrusal cebir

* eleman eleman, @ matris çarpımı yapar.

a = np.array([[1, 2, 3], [4, 5, 6]])
b = np.array([[1, 2], [3, 4], [5, 6]])

print(a @ b)

Doğrusal denklem sistemi Ax = y:

A = np.array([[1, 1, 1],
              [2, 1, 2],
              [1, 2, 3]], dtype=float)
y = np.array([9, 15, 20], dtype=float)

determinant = np.linalg.det(A)
x = np.linalg.solve(A, y)

print(determinant)
print(x)
print(A @ x)

Denklem çözmek için ters matris hesaplamak yerine np.linalg.solve tercih edilir. Determinant sıfıra çok yakınsa sistem tekil veya sayısal olarak sorunlu olabilir.

11. Bütünleştirici uygulama: Sensör verisi

rng = np.random.default_rng(7)
olcumler = rng.normal(loc=25, scale=2, size=(5, 8))

gunluk_ortalama = olcumler.mean(axis=1)
anormal_maske = (olcumler < 21) | (olcumler > 29)

print(gunluk_ortalama)
print(olcumler[anormal_maske])

Ders sonu alıştırmaları

  1. 0 ile 2π arasında 100 örnek üretip sinüs değerlerini hesaplayın.
  2. 4 × 5 rastgele tamsayı matrisinin satır ve sütun ortalamalarını bulun.
  3. Bir ölçüm dizisindeki ortalamadan iki standart sapmadan uzak değerleri filtreleyin.
  4. Bir matrisi sütun ortalamaları sıfır olacak şekilde merkezleyin.
  5. Üç bilinmeyenli bir doğrusal denklem sistemi kurup çözümü A @ x ile doğrulayın.