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))
arange: adım miktarıyla ilerler; bitiş değeri dahil değildir.linspace: başlangıç ve bitiş arasında istenen sayıda eşit aralıklı değer üretir.
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ı
0ile2πarasında 100 örnek üretip sinüs değerlerini hesaplayın.4 × 5rastgele tamsayı matrisinin satır ve sütun ortalamalarını bulun.- Bir ölçüm dizisindeki ortalamadan iki standart sapmadan uzak değerleri filtreleyin.
- Bir matrisi sütun ortalamaları sıfır olacak şekilde merkezleyin.
- Üç bilinmeyenli bir doğrusal denklem sistemi kurup çözümü
A @ xile doğrulayın.