İşte NumPy hakkında kapsamlı bir markdown formatında bilgi:
# NumPy
**NumPy** (Numerical Python'ın kısaltması), Python programlama dili için büyük, çok boyutlu dizileri ve matrisleri destekleyen, bu diziler üzerinde çalışacak geniş bir matematiksel fonksiyon koleksiyonu sağlayan bir kütüphanedir. Temel olarak bilimsel hesaplama için tasarlanmıştır ve [veri bilimi](https://www.nedemek.page/kavramlar/veri%20bilimi) ve [makine öğrenimi](https://www.nedemek.page/kavramlar/makine%20öğrenimi) alanlarında yaygın olarak kullanılır.
## Tarihçe
NumPy'nin kökleri, 1995 yılında oluşturulan **Numeric** kütüphanesine dayanır. Daha sonra, 2006 yılında Travis Oliphant, Numeric ve Numarray kütüphanelerini birleştirerek NumPy'yi oluşturdu. NumPy, açık kaynaklı bir projedir ve sürekli olarak geliştirilmektedir.
## Temel Özellikler
* **Çok Boyutlu Diziler (ndarray):** NumPy'nin en önemli özelliği, *ndarray* (n-dimensional array) olarak adlandırılan çok boyutlu dizi nesnesidir. Bu diziler, aynı veri tipine sahip elemanlardan oluşur ve verimli bir şekilde depolanır ve işlenir.
* **Vektörel Operasyonlar (Vectorization):** NumPy, döngüler kullanmak yerine dizi tabanlı işlemleri (vektörel operasyonları) destekler. Bu, performansı önemli ölçüde artırır.
* **Broadcast (Yayınlama):** Farklı şekillerdeki diziler üzerinde işlem yapmayı sağlayan bir mekanizmadır.
* **Matematiksel Fonksiyonlar:** NumPy, doğrusal cebir, Fourier dönüşümü ve rastgele sayı üretimi gibi çok çeşitli matematiksel fonksiyonlar sunar.
* **C ve Fortran Entegrasyonu:** NumPy, C ve Fortran gibi dillerde yazılmış kodlarla kolayca entegre edilebilir. Bu, performansı kritik uygulamalarda büyük avantaj sağlar.
## Ndarray (N-Boyutlu Dizi)
NumPy'deki temel veri yapısıdır. Bir ndarray aşağıdaki özelliklere sahiptir:
* **dtype:** Dizideki elemanların veri tipini belirtir (örneğin, int32, float64).
* **shape:** Dizinin boyutlarını gösteren bir tuple'dır (örneğin, (3, 4) 3 satır ve 4 sütunlu bir matrisi temsil eder).
* **ndim:** Dizinin boyut sayısını belirtir.
* **size:** Dizideki toplam eleman sayısını belirtir.
* **itemsize:** Her bir elemanın byte cinsinden boyutunu belirtir.
### Ndarray Oluşturma
NumPy ile çeşitli şekillerde ndarray oluşturulabilir:
* `numpy.array()`: Python listesi veya tuple'dan ndarray oluşturur.
* `numpy.zeros()`: Belirli bir şekilde ve veri tipinde sıfırlarla dolu bir ndarray oluşturur.
* `numpy.ones()`: Belirli bir şekilde ve veri tipinde birlerle dolu bir ndarray oluşturur.
* `numpy.empty()`: Belirli bir şekilde ve veri tipinde, başlangıç değerleri rastgele olan bir ndarray oluşturur.
* `numpy.arange()`: Belirli bir aralıkta eşit aralıklı değerler içeren bir ndarray oluşturur.
* `numpy.linspace()`: Belirli bir aralıkta eşit aralıklı sayıda değer içeren bir ndarray oluşturur.
* `numpy.random.rand()`: 0 ile 1 arasında rastgele sayılar içeren bir ndarray oluşturur.
### Dizi Indeksleme ve Dilimleme
Ndarray elemanlarına indeksleme ve dilimleme yoluyla erişilebilir. İndeksleme, belirli bir elemana erişmek için kullanılırken, dilimleme, dizinin bir alt kümesini (slice) oluşturmak için kullanılır.
### Dizi Şeklini Değiştirme
Bir ndarray'in şekli `numpy.reshape()` veya `ndarray.reshape()` yöntemleri kullanılarak değiştirilebilir.
### Dizi Birleştirme ve Bölme
NumPy, dizileri birleştirmek ve bölmek için çeşitli fonksiyonlar sağlar:
* `numpy.concatenate()`: Dizileri belirli bir eksen boyunca birleştirir.
* `numpy.stack()`: Dizileri yeni bir eksen boyunca yığıtlar.
* `numpy.split()`: Diziyi birden çok alt diziye böler.
## Vektörel Operasyonlar
NumPy, diziler üzerinde vektörel operasyonlar gerçekleştirmeyi kolaylaştırır. Bu, döngüler kullanmak yerine dizi tabanlı işlemlerin kullanılmasını sağlar ve performansı önemli ölçüde artırır. Örnekler:
* Aritmetik işlemler: +, -, \*, /, \*\* (üs alma)
* Karşılaştırma işlemleri: ==, !=, >, <, >=, <=
* Mantıksal işlemler: &, |, ~ (and, or, not)
* Evrensel fonksiyonlar (ufuncs): `numpy.sin()`, `numpy.cos()`, `numpy.exp()`, `numpy.log()`, vb.
## Broadcast (Yayınlama)
Broadcast, farklı şekillerdeki diziler üzerinde aritmetik işlemler gerçekleştirme yeteneğidir. NumPy, dizilerin şekilleri uyumsuz olduğunda, küçük diziyi daha büyük dizinin şekline "yayınlayarak" işlemi gerçekleştirir.
## Doğrusal Cebir
NumPy, [doğrusal cebir](https://www.nedemek.page/kavramlar/doğrusal%20cebir) işlemleri için kapsamlı bir araç seti sunar:
* `numpy.linalg.det()`: Matrisin determinantını hesaplar.
* `numpy.linalg.inv()`: Matrisin tersini hesaplar.
* `numpy.linalg.solve()`: Doğrusal denklem sistemlerini çözer.
* `numpy.linalg.eig()`: Matrisin özdeğerlerini ve özvektörlerini hesaplar.
* `numpy.dot()`: Matris çarpımı gerçekleştirir.
## Rastgele Sayı Üretimi
NumPy, çeşitli dağılımlardan rastgele sayılar üretmek için araçlar sağlar:
* `numpy.random.rand()`: 0 ile 1 arasında rastgele sayılar üretir.
* `numpy.random.randn()`: Standart normal dağılımdan rastgele sayılar üretir.
* `numpy.random.randint()`: Belirli bir aralıkta rastgele tamsayılar üretir.
* `numpy.random.choice()`: Bir diziden rastgele elemanlar seçer.
## Dosya Girdisi/Çıktısı
NumPy, dizileri dosyalardan okumak ve dosyalara yazmak için fonksiyonlar sağlar:
* `numpy.save()`: Diziyi ikili (binary) formatta bir dosyaya kaydeder.
* `numpy.load()`: Bir dosyadan kaydedilmiş bir diziyi yükler.
* `numpy.savetxt()`: Diziyi metin formatında bir dosyaya kaydeder.
* `numpy.loadtxt()`: Bir dosyadan metin formatında bir diziyi yükler.
## Uygulama Alanları
NumPy, çok çeşitli alanlarda kullanılır:
* **Bilimsel Hesaplama:** Fizik, kimya, biyoloji gibi bilimsel disiplinlerdeki simülasyonlar, veri analizi ve modelleme.
* **Veri Bilimi:** Veri temizleme, dönüştürme, analiz ve görselleştirme. [Pandas](https://www.nedemek.page/kavramlar/pandas) gibi kütüphanelerle birlikte sıklıkla kullanılır.
* **Makine Öğrenimi:** Algoritma geliştirme, veri önişleme ve model değerlendirme. [Scikit-learn](https://www.nedemek.page/kavramlar/scikit-learn) ve [TensorFlow](https://www.nedemek.page/kavramlar/tensorflow) gibi kütüphanelerle birlikte kullanılır.
* **Mühendislik:** Sinyal işleme, görüntü işleme, kontrol sistemleri ve diğer mühendislik uygulamaları.
## Avantajları
* **Hız:** Vektörel operasyonlar sayesinde döngülere göre çok daha hızlıdır.
* **Verimlilik:** Aynı veri tipine sahip elemanlardan oluşan diziler, belleği verimli bir şekilde kullanır.
* **Kullanım Kolaylığı:** Yüksek seviyeli arayüzü sayesinde kullanımı kolaydır.
* **Geniş İşlevsellik:** Çok çeşitli matematiksel, istatistiksel ve doğrusal cebir fonksiyonları sunar.
* **Entegrasyon:** Diğer Python kütüphaneleriyle (örneğin, SciPy, Matplotlib, Pandas) kolayca entegre edilebilir.
## Dezavantajları
* **Homojen Veri Tipi:** Dizideki tüm elemanlar aynı veri tipinde olmalıdır.
* **Bellek Kullanımı:** Büyük diziler, önemli miktarda bellek tüketebilir.
## Örnekler
```python
import numpy as np
# Dizi oluşturma
a = np.array([1, 2, 3, 4, 5])
print(a) # Output: [1 2 3 4 5]
# Dizi şeklini değiştirme
b = a.reshape((5, 1))
print(b)
# Output:
# [[1]
# [2]
# [3]
# [4]
# [5]]
# Vektörel operasyon
c = a + 10
print(c) # Output: [11 12 13 14 15]
# Matris çarpımı
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])
C = np.dot(A, B)
print(C)
# Output:
# [[19 22]
# [43 50]]
NumPy, Python'da bilimsel hesaplama için vazgeçilmez bir kütüphanedir. Çok boyutlu dizileri, vektörel operasyonları ve geniş işlevselliği sayesinde veri bilimi, makine öğrenimi ve diğer bilimsel uygulamalar için güçlü bir araçtır.