100 Soruda Numpy

İçindekiler

100 Soruda Numpy Bölüm 1 – Temel NumPy ve ndarray Kavramları

NumPy neden “bilimsel Python ekosisteminin temeli” olarak görülür?

Cevap: NumPy, Python’daki sayısal hesaplamaların merkezinde yer alır çünkü veriyi ndarray adı verilen yoğun (contiguous) çok boyutlu dizilerde saklar ve bu diziler üzerinde vektörleştirilmiş, C düzeyinde optimize edilmiş işlemler sunar. Bu sayede saf Python listelerine göre genellikle büyüklük mertebesinde hız kazanımı elde edilir. Ayrıca Pandas, SciPy, scikit-learn, Matplotlib gibi kütüphaneler NumPy dizilerini ortak veri modeli olarak kullanır. Bu ekosistem yaklaşımı, verinin kopyalanmadan bileşenler arasında aktarılmasını, bellek kullanımının düşmesini ve algoritmaların yeniden kullanılabilirliğini sağlar. Kısacası NumPy, hız, bellek verimliliği ve birlikte çalışabilirlik kombinasyonu nedeniyle çekirdek bileşen kabul edilir.


ndarray nedir ve Python listelerinden temel farkları nelerdir?

Cevap: ndarray, NumPy’nin temel veri yapısı olan, sabit boyutlu ve homojen tipte (tek dtype) elemanlar içeren N-boyutlu bir dizidir. Python listeleri heterojen tipte veriye izin verir ve her eleman ayrı bir Python nesnesi olduğu için bellek parçalı (non-contiguous) yapıdadır. ndarray ise elemanları bellekte tek blok hâlinde tutar; bu da CPU cache verimliliğini artırır. Ayrıca ndarray üzerinde toplama, çarpma gibi işlemler eleman seviyesinde vektörleştirilmiş şekilde çalışır ve C ile yazılmış döngüler kullanır; bu da Python döngülerine göre çok daha hızlıdır. Sonuç olarak ndarray, büyük sayısal veri kümeleriyle çalışırken hem daha hızlı hem de daha az bellek tüketen bir yapıdır.


NumPy’de dtype neden bu kadar kritiktir?

Cevap: dtype, bir ndarray içindeki tüm elemanların veri türünü tanımlar ve hem performans hem de sayısal doğruluk açısından belirleyicidir. Örneğin float32 seçmek bellek kullanımını azaltırken, float64 daha yüksek sayısal hassasiyet sağlar; büyük matris hesaplamalarında bu seçim, hem hız hem de nümerik kararlılık üzerinde ciddi farklar yaratabilir. Tamsayı dizilerinde int8, int16, int32, int64 gibi seçenekler depolayabileceğiniz en küçük ve en büyük değer aralıklarını belirler; taşma (overflow) hataları dtype’ın uygun seçilmemesiyle sık görülür. Ayrıca dtype’ın sabit olması, SIMD ve vektörleştirilmiş işlemler için CPU’nun optimize edilmesine imkân tanır.


NumPy’de “vektörleştirme (vectorization)” ne anlama gelir?

Cevap: Vektörleştirme, Python seviyesinde açık for döngüleri yazmak yerine işlemleri doğrudan tüm dizi üzerinde tek seferde tanımlamayı ifade eder. Örneğin bir liste üzerinde tek tek dolaşmak yerine y = 3*x + 2 gibi bir ifade ile tüm ndarray için işlem yapılır. Bu yaklaşım, iki sebeple performans kazandırır: (1) Döngüler C’de, düşük seviyede çalışır; Python yorumlayıcısının her iterasyonda devreye girmesine gerek kalmaz. (2) Bellek erişimi düzenlidir ve CPU cache daha etkin kullanılır. Müfredat ve mülakat sorularında, NumPy’nin gücünün büyük kısmının bu vektörleştirilmiş hesaplama modelinden geldiği sıkça vurgulanır.


NumPy neden yapay zekâ, veri bilimi ve makine öğrenmesinde bu kadar yaygındır?

Cevap: Makine öğrenmesi ve derin öğrenme algoritmaları, tipik olarak büyük tensörler üzerinde lineer cebir işlemleri yapar. NumPy, bu tensörleri (matris ve vektörleri) temsil etmek için standart ndarray yapısı, BLAS/LAPACK gibi yüksek performanslı kütüphanelere köprüler ve zengin lineer cebir fonksiyonları sunar. Birçok framework (ör. scikit-learn, bazı durumlarda PyTorch/TF öncesi veri hazırlama katmanı) veri ön-işleme, normalizasyon, özellik mühendisliği gibi adımlarda NumPy dizilerini kullanır. Ayrıca NumPy API’si, GPU tabanlı kütüphanelere (CuPy, JAX) de model olmuş; böylece araştırmacılar CPU ve GPU arasında benzer sözdizimiyle çalışabilmiştir. Bu nedenle NumPy, veri bilimi ekosisteminde ortak dil görevini görür.


Bölüm 2 – Dizi Oluşturma, Şekil Değiştirme ve İndeksleme

NumPy’de dizi oluşturmanın en çok kullanılan yöntemleri nelerdir?

Cevap: En temel yöntem np.array() ile Python liste veya tuple’larından dizi oluşturmaktır. Ancak pratikte sayısal aralık ve şablon fonksiyonları çok daha yaygın kullanılır. Örneğin np.zeros, np.ones, np.full sabit değerli diziler üretirken; np.arange ve np.linspace düzenli aralıklı sayılar oluşturur. Rastgele başlangıçlı modeller için np.random modülüyle rastgele diziler yaratılır. Matrissel yapılar için np.eye ve np.identity birim matris üretir. Bu fonksiyonlar, hem kodun okunabilirliğini artırır hem de dizi boyutlarını, tiplerini ve başlangıç değerlerini tek satırda belirlemenizi sağlar; bu da bilimsel deneyleri tekrarlanabilir ve sistematik hâle getirir.


reshape ile ravel / flatten arasındaki fark nedir?

Cevap: reshape, bir dizinin görünüş şeklini (shape) değiştirir; mümkünse aynı bellek bloğunu kullanarak görünümü yeniden düzenler. ravel, diziyi tek boyutlu hâle getirir ve çoğu durumda görünüm (view) döndürür; yani orijinal veriyle aynı bellek alanını paylaşır. flatten ise her zaman kopya (copy) üretir, bu nedenle üzerinde yapılan değişiklikler orijinali etkilemez. Büyük dizilerde gereksiz kopyalardan kaçınmak için, belleği paylaşan reshape ve ravel tercih edilir; ancak orijinal veriyi korumak istiyorsanız flatten güvenli seçenektir. Bu nüans, performans odaklı uygulamalarda sıkça sorulan bir mülakat konusudur.


Gelişmiş indeksleme (advanced indexing) ile temel dilimleme arasındaki fark nedir?

Cevap: Temel dilimleme (: operatörü, tam sayılı aralıklar) çoğunlukla görünüm döndürür; yani elde edilen alt dizi, orijinal dizinin bellek alanını paylaşır. Gelişmiş indeksleme ise liste, ndarray veya boolean maske kullanılarak yapılır ve her zaman yeni bir kopya oluşturur. Örneğin a[mask] veya a[[0, 2, 5]] gelişmiş indekslemedir. Bu fark, hem performans hem de yan etki yönetimi açısından kritiktir: Büyük veri kümelerinde istemeden kopya oluşturmak bellek baskısı yaratırken; görünüm üzerinde değişiklik yapmak da beklenmedik sonuçlara yol açabilir. Bu nedenle, hangi indeksleme türünün kullanıldığını bilmek ileri seviye NumPy kullanımının temelidir.


Boolean maskeleme ile eksik veya belirli koşulu sağlayan veriler nasıl seçilir?

Cevap: Boolean maskeleme, eleman bazında bir koşul ifadesi kullanarak True/False değerlerden oluşan bir maske dizisi üretmek ve bu maske ile alt küme seçmek anlamına gelir. Örneğin mask = (a > 0) & (a < 1) ifadesi, 0 ile 1 arasındaki tüm elemanları seçen bir maske üretir; a[mask] ise yalnızca bu elemanlardan oluşan yeni bir dizi döndürür. Bu yaklaşım, özellikle eksik değerleri (np.isnan, np.isfinite) veya uç değerleri filtrelemede oldukça yaygındır. Ayrıca maske kullanarak doğrudan atama da yapılabilir: a[mask] = 0 gibi. Bu tarz vektörleştirilmiş koşullu işlemler, döngü ve if yapılarına göre çok daha okunabilir ve performanslıdır.


Çok boyutlu dizilerde dilimleme (slicing) ve eksen mantığı nasıl çalışır?

Cevap: Çok boyutlu dizilerde her eksen için ayrı bir dilim verilir: a[ satır_dilimi , sütun_dilimi , ... ]. Örneğin a[0, :] ilk satırı, a[:, 0] ilk sütunu, a[1:3, 2:5] ise belirli bir alt blok matrisini seçer. NumPy’de eksenler, indeks sırasına göre soldan sağa tanımlanır ve her eksen bağımsız dilimlenebilir. Bu yapı, görüntü işleme (yükseklik × genişlik × kanal) veya zaman serisi tensörlerinde (zaman × örnek × özellik) sık kullanılır. Dilimleme sonucu genellikle görünüm döndürdüğü için, elde edilen alt dizi üzerinde yapılan değişiklikler orijinal diziyi de güncelleyebilir; bu davranış hem performans avantajı hem de dikkat edilmesi gereken bir yan etkidir.


Bölüm 3 – Yayınlama (Broadcasting), Ufunc ve Matematiksel İşlemler

NumPy’de broadcasting nedir ve hangi kurala göre çalışır?

Cevap: Broadcasting, farklı şekillere sahip diziler arasında eleman-bazlı işlemi mümkün kılan mekanizmadır. Temel kural, son eksenlerden başlayarak şekilleri karşılaştırmak ve eksenlerin ya eşit boyutta ya da 1 olması gerektiğini kabul etmektir. Boyutu 1 olan eksen, diğer eksenin boyutuna “genişletilerek” sanal olarak kopyalanır; fiziksel kopya oluşmadığı için bellek verimlidir. Örneğin (3, 1) şekilli bir dizi ile (1, 4) şekilli bir dizi toplandığında sonuç (3, 4) olur. Broadcasting, skaler ekleme, satır/sütun-bazlı normalizasyon ve özellik ölçekleme gibi veri bilimi senaryolarında yaygın olarak kullanılır.


Broadcasting hatalarını (incompatible shapes) nasıl teşhis eder ve düzeltirsiniz?

Cevap: Broadcasting hataları genellikle “operands could not be broadcast together with shapes …” mesajıyla ortaya çıkar. Bu durumda yapılacak ilk şey, işlem yapılan dizilerin shape’lerini yazdırarak son eksenlerden itibaren karşılaştırmaktır. Boyutların eşit olmadığı ve ikisinden birinin 1 olmadığı eksen, uyumsuzluğun kaynağıdır. Çözüm olarak np.expand_dims, np.newaxis veya reshape ile eksen eklenebilir ya da boyutlar yeniden düzenlenebilir. Örneğin (N,) ile (N, 1) karışıklıkları sık rastlanır; bu durumda vektör açıkça sütun veya satır vektörüne çevrilmelidir. Bu tür teşhis ve düzeltmeler, özellikle istatistiksel özelliklerin eksen bazlı hesaplandığı veri ön-işleme aşamalarında kritiktir.


Ufunc (universal function) nedir ve neden bu kadar önemlidir?

Cevap: Ufunc’lar, ndarray üzerinde eleman-bazlı çalışan, C düzeyinde uygulanmış, vektörleştirilmiş fonksiyonlardır. Örneğin np.sin, np.exp, np.add, np.maximum birer ufunc’tır. Ufunc’lar, broadcasting kurallarına otomatik uyar, tip dönüştürme (type casting) ve çıktı için dtype yönetimi yapar, ayrıca out parametresi ile bellek üzerinde yerinde (in-place) çalışabilir. Bu özellikler, yoğun matematiksel hesaplamalarda hem hız hem de esneklik sağlar. Ek olarak, np.vectorize veya frompyfunc ile Python fonksiyonları ufunc benzeri davranacak şekilde sarmalanabilir; ancak gerçek performans kazanımı, C ile yazılmış yerleşik ufunc’larda elde edilir.


Eleman-bazlı işlemler ile matris işlemleri arasındaki fark nasıl yönetilir?

Cevap: NumPy’de * operatörü eleman-bazlı çarpma yapar; lineer cebirsel matris çarpımı için np.dot veya @ (matmul) operatörü kullanılır. Bu ayrım özellikle makine öğrenmesi ve istatistikte kritik öneme sahiptir; yanlışlıkla element-wise yerine matris çarpımı yapmak, sonuçları tamamen bozabilir. Benzer şekilde np.power ile eleman-bazlı üs alma yapılırken, matris kuvveti için scipy.linalg fonksiyonları gibi farklı araçlara başvurmak gerekir. Kod yazarken, değişken isimlerini ve yorum satırlarını açık tutmak, bu iki işlem türünün karışmasını engellemek açısından iyi bir pratiktir.


Koşullu işlemler için np.where ve ufunc’ların nasıl kombinasyonu yapılır?

Cevap: np.where fonksiyonu, vektörleştirilmiş bir if-else yapısı gibi çalışır: np.where(cond, x, y) ifadesi, cond doğru olduğunda x, yanlış olduğunda y değerini seçer. Bu, ufunc’ların çıktılarını koşullu olarak birleştirmek için idealdir. Örneğin z = np.where(a > 0, np.log(a), 0.0) ifadesi, pozitif elemanlara logaritma uygularken diğerlerini sıfır yapar. Bu yaklaşım, finansal risk modelleri, parça-parça tanımlı fonksiyonlar ve eksik veri yönetiminde yaygın olarak kullanılır. Döngü ve iç içe if yapısı yerine tek satırlık vektörleştirilmiş ifade ile hem kod sadeleşir hem de önemli performans avantajı elde edilir.


Bölüm 4 – Lineer Cebir ve Sayısal Hesaplama

NumPy’de temel lineer cebir işlemleri için hangi modül kullanılır?

Cevap: NumPy’nin lineer cebir fonksiyonları np.linalg modülünde toplanmıştır. Bu modül, matris determinanti (np.linalg.det), tersini alma (np.linalg.inv), özdeğer/özvektör hesaplama (np.linalg.eig), tekil değer ayrışımı (np.linalg.svd) ve lineer denklem sistemlerini çözme (np.linalg.solve) gibi fonksiyonlar içerir. Bu fonksiyonlar, çoğunlukla BLAS/LAPACK gibi optimize edilmiş kütüphaneleri kullanır ve bu nedenle saf Python implementasyonlarına göre çok daha hızlı ve güvenilirdir. Uygulamada, istatistiksel modelleme, PCA, regresyon ve sayısal simülasyonlar gibi pek çok alanda bu fonksiyonlara doğrudan başvurulur.


Lineer denklem sistemi çözümünde neden np.linalg.solve kullanmak inv’den daha iyidir?

Cevap: Ax = b denklemi için matematiksel olarak x = A⁻¹b doğru olsa da, sayısal hesaplamada önce A’nın tersini hesaplayıp sonra çarpmak hem daha maliyetli hem de daha az kararlı bir yaklaşımdır. np.linalg.solve, sistemi faktörizasyon (ör. LU) ile doğrudan çözer ve ters matrisin açıkça hesaplanmasından kaçınır. Bu, hem hesaplama süresini azaltır hem de yuvarlama hatalarının birikmesini engeller. Büyük boyutlu sistemlerde bu fark çok daha belirgindir. Bu nedenle, akademik ve endüstriyel uygulamalarda “ters matris hesaplamayın, sistemi doğrudan çözün” prensibi temel bir en iyi uygulama olarak kabul edilir.


NumPy ile özdeğer ve özvektör hesaplamanın tipik kullanım alanları nelerdir?

Cevap: Özdeğer ve özvektörler, özellikle boyut indirgeme (PCA), spektral kümelenme, Markov zincirleri ve diferansiyel denklem çözümlerinde merkezi rol oynar. np.linalg.eig, kare matrislerin özdeğer ve özvektörlerini hesaplar; simetrik/hermitian matrisler için daha kararlı ve verimli olan np.linalg.eigh tercih edilir. PCA’de kovaryans matrisi üzerinden elde edilen en büyük özdeğerlere karşılık gelen özvektörler, verinin ana bileşenlerini oluşturur. Bu tür işlemler, veri bilimi ve istatistiksel öğrenme derslerinin NumPy içeren örneklerinde sıkça karşımıza çıkar.


Sayısal kararlılık (numerical stability) açısından hangi NumPy pratikleri önerilir?

Cevap: Sayısal kararlılık için birkaç temel ilke öne çıkar: (1) Çok büyük veya çok küçük ölçekli verileri normalleştirmek/standartlaştırmak, (2) Matrix inversion yerine solve gibi daha kararlı algoritmaları tercih etmek, (3) Toplama işlemlerinde büyük ve küçük büyüklükteki sayıları karıştırırken Kahan toplamı benzeri teknikler (veya dtype’ı float64 seçmek) kullanmak, (4) Log-uzayında hesaplama yaparak taşma/alt-taşma riskini azaltmak. NumPy, bu pratikleri uygulamak için gerekli fonksiyonları sağlar; ancak kararlılık çoğu zaman algoritma tasarımı düzeyinde alınan kararlara bağlıdır.


NumPy ile büyük matrissel hesaplamaları hızlandırmak için hangi stratejiler kullanılabilir?

Cevap: Büyük matrislerde hız için öncelikle vektörleştirme ve broadcasting ile saf Python döngülerinden kaçınmak gerekir. Ardından, operasyonları mümkün olduğunca toplu hâle getirmek (örneğin birden fazla matris çarpımını tek @ zincirine sıkıştırmak) önemlidir. BLAS seviyesini yüksek tutan NumPy dağıtımları (MKL, OpenBLAS) tercih edilebilir. Bellek açısından, gereksiz kopyalardan kaçınmak için out parametresi ve yerinde (in-place) işlemler kullanılmalıdır. Son olarak, çok büyük veri kümeleri için, parçalı işlem (chunking), bellek eşlemeli dosyalar (memmap) veya GPU tabanlı NumPy benzerleri (CuPy, JAX) devreye alınarak hesaplama daha da ölçeklenebilir.


Bölüm 5 – Performans, Bellek Yönetimi ve Diğer Kütüphanelerle Entegrasyon

Soru 5.1 – NumPy, saf Python listelerine göre neden daha az bellek kullanır?

Cevap: Python listelerinde her eleman ayrı bir Python nesnesi olduğundan, her biri için ek meta veri (tip bilgisi, referans sayacı vb.) tutulur ve bellek adresleri parçalı yapıdadır. NumPy ndarray ise elemanları sabit boyutlu ham veri olarak tek bir contiguous blokta saklar; tip bilgisi yalnızca dtype’ta tutulur. Bu, hem nesne başına overhead’i ortadan kaldırır hem de CPU cache dostu erişim sağlar. Özellikle milyonlarca eleman içeren dizilerde, bu fark çok dramatiktir: Aynı veri miktarı, listelere göre çoğu zaman kat kat daha az bellekle temsil edilebilir ve bu da algoritmaların daha büyük veri setleri üzerinde çalışmasına imkân verir.


NumPy’de bellek düzeni (c vs Fortran order) performansı nasıl etkiler?

Cevap: NumPy dizileri varsayılan olarak C-order (satır-öncelikli) formatında tutulur; bu durumda aynı satırdaki elemanlar bellekte yan yana yer alır. Fortran-order (sütun-öncelikli) dizilerde ise sütun elemanları contiguous’tur. Çok boyutlu diziler üzerinde döngü veya vektörleştirilmiş işlemler yaparken, iç döngünün contiguous yönde ilerlemesi performansı belirgin biçimde artırır; çünkü CPU cache, ardışık bellek erişimlerinde en verimli şekilde kullanılır. NumPy’de order='F' ile Fortran düzeninde dizi oluşturabilir veya np.asfortranarray ile dönüştürebilirsiniz. Özellikle lineer cebir rutinleri ve BLAS arka planında çalışan fonksiyonlar için uygun bellek düzeni seçimi önemli hız kazanımları sağlayabilir.


Bellek eşlemeli dosyalar (memmap) ile çok büyük diziler nasıl yönetilir?

Cevap: np.memmap, diskteki bir dosyayı sanki RAM’deki bir ndarray’miş gibi kullanmanızı sağlar. Bu yapı, özellikle RAM’e sığmayacak kadar büyük veri kümeleriyle çalışırken kullanılır. NumPy, sadece ihtiyaç duyulan parçaları diskten okur; işletim sisteminin sayfalama mekanizması devreye girer. Örneğin çok büyük görüntü veri setleri veya zaman serileri için, tamamını RAM’e almadan blok blok işlem yapmak mümkündür. Dezavantajı, disk erişimi RAM’e göre çok daha yavaş olduğundan, rastgele erişimin (random access) pahalı olmasıdır. Bu yüzden memmap kullanırken, algoritmayı mümkün olduğunca sıralı erişimi tercih edecek şekilde tasarlamak gerekir.


NumPy ile Pandas ve Matplotlib arasındaki ilişki nasıldır?

Cevap: Pandas’ın Series ve DataFrame yapıları, altta çoğunlukla NumPy ndarray’lerini kullanır; bu nedenle istatistiksel ve analitik fonksiyonların birçoğu NumPy fonksiyonlarına delegasyon yapar. Veri hazırlama sürecinde, kompleks indeksleme ve eksik veri yönetimi için Pandas; düşük seviyeli sayısal işlemler için NumPy tercih edilir. Matplotlib ise çizim fonksiyonlarına genellikle NumPy dizileri veya dizimsi (array-like) nesneler bekler. Böylece, veriyi NumPy ile işleyip, Pandas ile organize edip, Matplotlib ile görselleştirmek, veri bilimi iş akışlarında standart bir model hâline gelmiştir. Bu sıkı entegrasyon, NumPy’nin ekosistem içindeki stratejik konumunu daha da güçlendirir.


NumPy performansını artırmak için tipik profil ve optimizasyon adımları nelerdir?

Cevap: İlk adım, timeit veya profil araçlarıyla (ör. line_profiler) kodun en çok zaman harcayan bölümlerini tespit etmektir. Sonrasında, bu bölümlerdeki Python döngüleri vektörleştirilmiş NumPy işlemlerine dönüştürülür; kopya oluşumunu azaltmak için copy() çağrıları, gereksiz astype ve yeniden şekillendirmeler gözden geçirilir. Bellek erişim desenleri analiz edilerek, contiguous olmayan diziler np.ascontiguousarray ile düzenlenebilir. Eğer hâlâ performans yetersizse, numba ile JIT derleme, Cython, C/Fortran genişletmeleri veya GPU tabanlı NumPy benzerleri (CuPy) devreye alınabilir. Böylece, NumPy hem prototipleme hem de üretim ortamına yakın performans için güçlü bir araç hâline gelir.


Bölüm 6 – Rastgele Sayılar, İstatistiksel Dağılımlar ve NumPy Random

NumPy’nin yeni Generator tabanlı Random API’si neden eski np.random yapısından daha başarılıdır?

Cevap: Generator sınıfı, bağımsız ve yeniden üretilebilir (reproducible) rastgele sayı akışları yönetir. Eski RandomState tek bir global durum kullandığı için çok çekirdekli simülasyonlarda veri sızıntısına ve deterministik olmayan davranışlara yol açabiliyordu. Generator, farklı dağılımlar için daha hızlı algoritmalar (ör. PCG64) kullanır; ayrıca paralel işleme, Monte Carlo simülasyonları ve istatistiksel modelleme için izole random stream’leri oluşturmayı kolaylaştırır. Modern bilimsel hesaplamalarda bağımsız akış üretimi kritik olduğundan yeni API büyük avantaj sağlar.


NumPy’de en sık kullanılan rastgele dağılımlar hangileridir ve hangi durumlarda kullanılır?

Cevap: Normal dağılım (normal) regresyon modelleri ve gürültü eklemede, uniform dağılım (uniform) simülasyon ve başlangıç değerlerinde, binom dağılımı (binomial) olasılık temelli karar sistemlerinde, Poisson dağılımı (poisson) olay sayımı modellerinde, beta dağılımı (beta) Bayesyen modellerde yoğun kullanılır. Generator API’si bu dağılımları yüksek performanslı algoritmalarla üretir ve veri bilimi, istatistik ve yapay zekâ uygulamalarında yaygın tercih edilir.


Rastgele sayı üretiminde tohumlama (seed) neden önemlidir?

Cevap: Tohumlama, deneylerin yeniden üretilebilirliğini sağlar. Bilimsel çalışmalarda aynı modelin farklı ortamlarda aynı sonuçları vermesi gerekir; rastgele başlangıç değerleri sonuçları etkileyebilir. Generator(PCG64(1234)) gibi sabit bir tohum, eğitim/test bölme, veri artırma, optimizasyon ve Monte Carlo simülasyonlarında deterministik sonuç üretir. Bu, akademik yayınlar ve endüstriyel Ar-Ge çalışmalarında zorunluluktur.


Büyük örneklemli istatistiksel simülasyonlarda NumPy nasıl avantaj sağlar?

Cevap: NumPy’nin random modülü C düzeyinde optimize edildiği için milyonlarca örneği Python döngüleri olmadan üretebilir. Generator improve edilmiş PRNG algoritması (PCG64) ile daha hızlıdır. Ayrıca vektörleştirme sayesinde tek çağrıda büyük diziler oluşturulur. Bellek kullanımını azaltmak için dtype optimizasyonu yapılabilir. Bu özellikler, bootstrap, Monte Carlo ve MCMC analizleri için NumPy’yi standart araç yapar.


choice fonksiyonu ile rassal örnekleme nasıl yapılır?

Cevap: choice hem eşit olasılıklı hem de ağırlıklı örnekleme yapabilir. Örneklem tekrarlı (replace=True) veya tekrarsız (replace=False) alınabilir. Büyük veri setlerinde ağırlıklı örnekleme, veri artırma, sınıf dengesizliği düzeltme ve istatistiksel yeniden örnekleme (resampling) işlemlerinde kritik rol oynar. NumPy’nin vektörleştirilmiştir ve büyük ölçekli çalışmalarda oldukça hızlıdır.


Bölüm 7 – Eksik Veri, NaN, Standartlaştırma ve Normalizasyon

NumPy’de NaN değerler neden sıkıntı yaratır?

Cevap: NaN, IEEE 754 standardına göre özel bir “tanımlanamayan sayı”dır ve çoğu matematiksel işlem NaN içerdiğinde tüm sonucu NaN yapar. Toplam, ortalama, standart sapma gibi işlemler bozulur. Bu nedenle veri analizi yaparken NaN’lerin tespit edilmesi (np.isnan, np.isfinite) ve uygun yöntemlerle düzeltilmesi gerekir.


NaN yönetimi için en iyi uygulamalar nelerdir?

Cevap: İlk adım NaN’leri tespit etmektir. Sonrasında:

  • Silme (listwise deletion),
  • Ortalama/medyan ile doldurma,
  • Grup bazlı doldurma,
  • İleri/geri doldurma,
  • Model tabanlı tahmin (regresyon imputation)
    gibi yöntemler uygulanabilir. NumPy tek başına sınırlıdır; bu nedenle Pandas veya scikit-learn ile birlikte kullanıldığında etkisi artar.

Veri standardizasyonu (z-score) NumPy ile nasıl yapılır ve neden gereklidir?

Cevap: Z-score standardizasyonu (x - mean) / std formülüyle yapılır. Bu işlem, özellikle makine öğrenmesi modellerinde değişkenler arasındaki ölçek farklarını ortadan kaldırarak eğitimi stabilize eder. PCA gibi algoritmalar ölçek duyarlıdır; bu nedenle NumPy’nin vektörleştirilmiş matematiksel fonksiyonlarıyla ölçekleme hızlı ve güvenilir biçimde yapılır.


Min-max normalizasyonu hangi durumlarda tercih edilir?

Cevap: Min-max, veri değerlerini belirli bir aralığa (genellikle 0–1) dönüştürür. Görüntü işleme, sinyal işleme ve nöral ağ modellerinde sık kullanılır; çünkü aktivasyon fonksiyonları belirli aralıklara duyarlıdır. Aykırı değerlerden etkilendiği için dikkatli kullanılmalıdır.


Aykırı değer tespiti için NumPy ile hangi teknikler uygulanabilir?

Cevap: En yaygın yöntem IQR tekniğidir. Q1 ve Q3 hesaplanır ve IQR = Q3 – Q1 bulunur. Alt/üst sınırlar:

  • Alt sınır = Q1 – 1.5×IQR
  • Üst sınır = Q3 + 1.5×IQR
    Bu sınırların dışında kalan değerler aykırı kabul edilir. NumPy’nin hızlı istatistiksel fonksiyonları, milyonluk veri setlerinde bile bu işlemi verimli şekilde yapar.

Bölüm 8 – Hafıza, Stride, View/Copy Semantiği ve Düşük Seviye Mekanizmalar

NumPy’de “stride” nedir ve performansı nasıl etkiler?

Cevap: Stride, bir sonraki elemana geçmek için bellekte kaç byte ilerlenmesi gerektiğini tanımlar. Contiguous dizilerde stride düzenlidir; bu CPU cache’i maksimize eder. Contiguous olmayan diziler (ör. dilimlenmiş matrisler) daha düşük performans verir. Stride yapısının anlaşılması, NumPy’nin bellek modelini çözmenin anahtarıdır.


View ve copy farkı neden bu kadar kritiktir?

Cevap: View (görünüm) orijinal veriyle aynı belleği paylaşır; copy ise yeni bir bellek oluşturur. Örneğin reshape, ravel, dilimleme işlemleri genellikle view döndürür. Bu, performans avantajı sağlar ancak alt dizide yapılan değişikliklerin ana diziyi etkilemesine yol açabilir. Büyük projelerde bu nüans gözden kaçtığında kritik hatalar doğabilir.


np.ascontiguousarray ne işe yarar?

Cevap: Bu fonksiyon, contiguous olmayan dizileri contiguous düzene çevirir. Stride düzensiz olduğunda BLAS çağrılarının yavaşlaması veya hata vermesi mümkün olduğundan, matris çarpımı gibi işlemlerden önce contiguous bellek düzeni istenebilir. Bilimsel hesaplamalarda performans optimizasyonu için sık kullanılır.


NumPy bellek üzerinde in-place işlem yapmayı nasıl destekler?

Cevap: Ufunc’larda out= parametresi ile çıktı aynı dizinin üzerine yazılabilir:
np.add(a, b, out=a) gibi. Bu, yeni dizi oluşturmayı engeller ve bellek kullanımını dramatik biçimde düşürür. Deep learning preprocessing aşamalarında sıkça kullanılan bir tekniktir.


NumPy C API hangi durumlarda kullanılır?

Cevap: NumPy C API, Python dışındaki dillerden NumPy dizileriyle doğrudan etkileşim kurmak için kullanılır. Örneğin performans-kritik C modülleri geliştirmek, Python–C++ köprüleri kurmak, özel derleyiciler veya hesaplama motorları yazmak gibi ileri seviye çalışmalarda NumPy dizilerine erişmek gerekir. Bu API, büyük Ar-Ge projelerinde hız optimizasyonu için önemlidir.


Bölüm 9 – Gerçek Dünya Kullanımları, Bilimsel Uygulamalar ve Veri Bilimi

NumPy görüntü işleme alanında neden temel araçtır?

Cevap: Görüntüler, piksel matrislerinden oluşur ve doğal olarak ndarray yapısına uygundur. Renkli görüntüler genellikle (Yükseklik × Genişlik × Kanal) şeklindedir. Görüntü filtreleri, konvolüsyonlar, histogram eşitleme gibi işlemler NumPy’nin vektörleştirilmiş fonksiyonlarıyla yüksek performansla yapılabilir. OpenCV, scikit-image gibi kütüphaneler de veri modelinde NumPy dizilerini kullanır.


Zaman serisi analizinde NumPy’nin rolü nedir?

Cevap: Zaman serileri matris biçiminde modellendiği için NumPy spinelidir. Kaydırmalı pencereler, fark alma, hareketli ortalama gibi işlemler NumPy ufunc’larıyla hızlı biçimde yapılır. Veri ön-işleme, gürültü giderme ve regresyon modellerine veri hazırlama aşamalarında yoğun şekilde kullanılır.


PCA (Principal Component Analysis) hesaplamasında NumPy neden idealdir?

Cevap: PCA, kovaryans matrisi → SVD/özdeğer ayrışımı dizisini içerir. NumPy’nin np.cov, np.linalg.eig, np.linalg.svd fonksiyonları C seviyesinde optimize edilmiştir. Bu nedenle yüksek boyutlu matrislerde bile hızlı, kararlı ve tekrarlanabilir sonuçlar verir.


Finans matematiğinde NumPy hangi problemler için kullanılır?

Cevap: Opsiyon fiyatlama (Black-Scholes), portföy optimizasyonu, risk simülasyonları (Monte Carlo), VaR/CVaR hesaplamaları, korelasyon–kovaryans matrisleri gibi birçok problemde NumPy dizileri ve lineer cebir fonksiyonları çekirdek bileşen olarak kullanılır.


Bilimsel simülasyonlarda NumPy’nin avantajları nelerdir?

Cevap: Diferansiyel denklem çözümleri, ızgara tabanlı fizik modelleri, parçacık simülasyonları gibi işlemlerde NumPy’nin hızlı array işlemleri, güçlü lineer cebir araçları ve vektörleştirilmiş fonksiyonları en iyi performansı sağlar. Ayrıca sonuçlar kolayca diğer bilimsel kütüphanelere aktarılabilir.



Bölüm 10 – Hatalar, Tuzaklar ve En İyi Uygulamalar

NumPy’de yapılan en yaygın hata: “list comprehension kullanmak”. Neden yanlıştır?

Cevap: NumPy’nin gücü vektörleştirmededir. for döngüsü veya list comprehension kullanmak, hesaplamayı Python seviyesine çeker ve performansı dramatik biçimde düşürür. Bunun yerine doğrudan ndarray ifadeleri veya ufunc’lar kullanılmalıdır.


astype() kullanırken gizli kopya oluştuğunu nasıl anlarsınız?

Cevap: astype her zaman yeni bir kopya üretir. Büyük veri setlerinde bu büyük maliyet oluşturur. Bunu kontrol etmek için a is a.astype(...) ifadesi daima False döner. Dtype dönüşümünü minimumda tutmak performans için önemlidir.


“ValueError: operands could not be broadcast together” hatası nasıl çözülür?

Cevap: Bu hata, shape uyumsuzluğundan kaynaklanır. Çözüm:

  1. a.shape, b.shape değerlerini kontrol et.
  2. Son eksenlerden başlayarak karşılaştır.
  3. np.newaxis, reshape veya eksen ekleme ile uygun hale getir.
    Broadcasting kuralını doğru anlamak kritik önem taşır.

np.concatenate ve np.stack farkı nedir?

Cevap: concatenate, mevcut eksenlerden birinde dizileri birleştirir. stack ise yeni bir eksen ekleyerek birleştirir. Örneğin iki (3, 4) matris concatenate ile yine (3, 8) olabilirken, stack ile (2, 3, 4) olur. Derin öğrenme batching işlemlerinde stack sık kullanılır.


NumPy’de büyük dizilerle çalışırken hangi optimizasyonlar kritik önem taşır?

Cevap: (1) Gereksiz kopyalardan kaçınmak, (2) dtype’ı doğru seçmek, (3) in-place işlemleri tercih etmek, (4) vektörleştirme ve broadcasting kullanmak, (5) contiguous bellek düzeni sağlamak, (6) mümkünse BLAS hızlandırmalı NumPy dağıtımlarını kullanmak, (7) büyük veri için memmap veya chunk yöntemiyle parça parça işlem yapmak. Bu teknikler milyonlarca elemanlı veri setlerinde performansı katlar.


Kategori 11 – Matris Operasyonları, Determinant, Ters, Rank ve SVD

Matrisin rütbesi (rank) Numpy ile nasıl hesaplanır ve neden önemlidir?

Cevap: Matris rank’ı, matrisin satır/sütun uzayının boyutudur ve doğrusal bağımlılığı ölçer. NumPy’de np.linalg.matrix_rank(A) ile hesaplanır. Rank, lineer sistemlerin çözüm yapısını belirler: tam rank bir matris tekil olmayan çözümler üretir; düşük rank ise sonsuz çözüm veya çözümsüzlük ihtimalini gösterir. Regresyon, PCA ve bilgi sıkıştırma gibi alanlarda rank kritik parametredir.


Determinant neden bazı problemlerde tercih edilmez?

Cevap: Determinant çok büyük veya çok küçük sayılara dönüşebilir ve sayısal kararsızlığa yol açabilir. Ayrıca determinantın sıfıra yakın olması durumunda matris neredeyse tekildir ancak determinant bunu açıkça göstermez. Bu yüzden tekillik testi için çoğu zaman cond (condition number) veya rank kullanmak daha güvenilirdir. NumPy’de np.linalg.det(A) hızlı olsa da bilimsel uygulamalarda doğrudan tanı için önerilmez.


NumPy’de SVD (Singular Value Decomposition) ne zaman tercih edilir?

Cevap: SVD, matrisleri kararlı şekilde ayrıştırır ve PCA, düşük-rank yaklaşımı, gürültü azaltma, öneri sistemleri ve boyut indirgeme için standart yöntemdir. np.linalg.svd(A, full_matrices=False) bilimsel hesaplamalarda en çok kullanılan biçimidir. SVD, özdeğer ayrışımına göre daha kararlıdır ve her matrise uygulanabilir.


Moore–Penrose pseudoinverse neden ters matristen daha çok kullanılır?

Cevap: Gerçek dünyada, modeller tam kare veya tam rank olmayan matrislerle çalışır. Pseudoinverse (pinv), bu tür durumlarda en küçük kareler çözümünü verir ve gürültüye dayanıklıdır. np.linalg.pinv(A) SVD tabanlıdır, bu da numerik kararlılığı artırır. Regresyon, sinyal işleme ve kontrol teori uygulamalarında standarttır.


Matrislerin koşul sayısı (condition number) neden önemlidir?

Cevap: Koşul sayısı, matrisin çözüm hassasiyetini ölçer. np.linalg.cond(A) çok yüksekse (ör. 10⁹+) matris kötü koşulludur ve küçük giriş hataları büyük çıkış hatalarına dönüşebilir. Bu, sayısal analizde en kritik kararlılık ölçütlerinden biridir. Özellikle regresyon ve PDE çözümlerinde kullanılır.



Bölüm 12 – Sayısal Türev, İntegral, Yaklaşıklık ve Diferansiyel Denklemler

NumPy sayısal türev hesaplamaları için nasıl kullanılır?

Cevap: Türev, f'(x) ≈ (f(x+h) – f(x–h))/(2h) merkez fark formülüyle hesaplanabilir. NumPy’nin vektörleştirilmiş işlemleri ile bu hesaplamalar döngüsüz yapılır. Büyük veri kümelerinde sayısal diferansiyasyon hız kazanır. Sinyal işleme, fiziksel simülasyonlar ve optimizasyon problemlerinde temel araçtır.


Neden çok küçük h değerleri türevde kararsızlığa yol açar?

Cevap: h küçüldükçe fark ifadesi iki büyük sayının farkına dönüşür ve floating-point hassasiyeti nedeniyle yuvarlama hatası büyür. Bu durum “cancellation error” olarak bilinir. Sayısal türevde optimum h değeri seçmek gerekir. NumPy’nin float64 hassasiyeti çoğu uygulama için yeterlidir.


NumPy integral hesaplamalarında nasıl kullanılır?

Cevap: Riemann toplamı yaklaşımıyla integral hesaplanabilir:
integral ≈ np.sum(f(x) * dx).
Yeterince küçük dx ve yoğun aralık seçimi ile yüksek doğruluk elde edilir. Bilimsel simülasyonlarda yüksek performans sağlar. Ancak daha sofistike yöntemler için SciPy’nin quad fonksiyonları tercih edilir.


NumPy ile diferansiyel denklem çözülebilir mi?

Cevap: NumPy temel diferansiyel denklem çözücülerini içermez fakat ODE çözümleri için gerekli olan matris hesaplamaları, eğim fonksiyonları ve zaman adımlamaları NumPy ile uygulanabilir. Euler veya Runge–Kutta gibi yöntemler NumPy ile yüksek performanslı şekilde kodlanabilir. Gelişmiş çözücüler için SciPy kullanılır.


Sayısal çözümde stabilite analizi neden kritiktir?

Cevap: Yinelemeli ODE/PDE çözümlerinde zaman adımı (Δt) çok büyük seçilirse çözüm “patlar”. Bu nedenle stabilite sınırları (ör. CFL Condition) kontrol edilmelidir. NumPy hızlı matris işlemlerini sağladığından stabilite testi yapmak kolaylaşır. Bilimsel hesaplamalarda doğruluğun kilit parçasıdır.



Bölüm 13 – Fourier Dönüşümü, Sinyal İşleme ve Filtreleme

NumPy’de FFT (np.fft.fft) hangi durumlarda kullanılır?

Cevap: FFT zaman domenindeki sinyalleri frekans domenine dönüştürür. Sinyal işleme, titreşim analizi, ses işleme, görüntü filtrasyonu ve spektral analizde en temel araçtır. NumPy’nin FFT uygulaması optimize edilmiştir ve milyonlarca örnek üzerinde hızlı çalışır.


FFT sonucunda kompleks sayılar neden ortaya çıkar?

Cevap: Zaman domenindeki reel sinyaller çoğunlukla sinüs ve kosinüs bileşenlerinin süperpozisyonudur. Bu bileşenlerin faz ve genlik bilgisini temsil etmek için karmaşık sayı kullanılır. Kompleks spektrum frekans analizi için zorunludur ve bilgi kaybı yaratmaz.


Nyquist frekansı ve aliasing NumPy ile nasıl analiz edilir?

Cevap: NumPy’nin FFT fonksiyonları ile sinyalin frekans spektrumu elde edilir. Örnekleme frekansının yarısı Nyquist frekansıdır; sinyal bu sınırın üzerinde örneklendiğinde aliasing oluşur. Bu durum yanlış frekans bileşenlerinin oluşmasına neden olur. FFT sonuçlarının incelenmesi aliasing tespiti için temel yaklaşımdır.


Düşük geçiren filtre NumPy ile nasıl uygulanır?

Cevap: FFT alınır, yüksek frekans bileşenleri mask ile sıfırlanır ve ters FFT (ifft) uygulanır. Bu yöntem hızlıdır ve sinyal düzenleme (noise reduction) için etkilidir. NumPy’nin vektörleştirilmiş yapısı filtre tasarımını kolaylaştırır.


Konvolüsyon işlemi NumPy’de nasıl yapılır?

Cevap: np.convolve veya FFT tabanlı konvolüsyonlar kullanılabilir. Görüntü işlemede 2D konvolüsyon için SciPy’nin signal.convolve2d fonksiyonları daha uygundur ancak temel matris çarpımları NumPy ile yüksek verimle uygulanabilir.



Bölüm 14 – Çok Boyutlu Diziler, Tensor İşlemleri ve İleri Yapılar

NumPy neden bir “tensör” kütüphanesi olarak kabul edilir?

Cevap: ndarray sınırsız sayıda eksene izin verir ve tensör işlemlerine uygun yapıda tasarlanmıştır. Derin öğrenme kütüphanelerindeki tensör yapılarına temel teşkil eder; eksen bazlı operasyonlar, broadcasting ve matris algebra NumPy üzerinden modellenmiştir.


Eksensel (axis-based) işlemler neden önemlidir?

Cevap: Birden fazla boyutlu veride ortalama, toplam veya standardizasyon işlemleri belirli eksenlere göre yapılır. Örneğin görüntülerde kanal ekseni üzerinden normalize etmek gerekir. NumPy’nin axis parametresi bu esnekliği sağlar. Eksensel operasyonları anlamak veri işleme için zorunludur.


np.transpose ile swapaxes farkı nedir?

Cevap: transpose, tüm eksenleri yeniden sıralar; swapaxes yalnızca iki eksenin yerini değiştirir. Çok boyutlu dizilerde, özellikle tensör biçimlendirmelerinde doğru dönüşümü seçmek kritik önem taşır.


Tensör çoğullama (tensor contraction) nedir?

Cevap: Tensör kontraksiyonu, belirli eksenler boyunca toplama işlemidir; matmul bunun özel bir halidir. NumPy’de np.tensordot bu işlemleri güçlü ve verimli şekilde yapar. Fizik simülasyonları (kuantum hesaplama vb.) ve deep learning mimarilerinde yaygın şekilde kullanılır.


NumPy’de einsum neden profesyoneller tarafından sıkça tercih edilir?

Cevap: einsum, Einstein toplam notasyonunu kullanarak karmaşık tensör işlemlerini tek satırda tanımlamaya izin verir. Kod okunabilirliğini artırır, gereksiz ara kopyaları engeller ve çoğu zaman daha hızlıdır. Matris çarpımı, outer product, batched operation ve tensör kontraksiyonlarında üst düzey performans sağlar.



Bölüm 15 – İstatistiksel Hesaplamalar, Korelasyon, Kovaryans ve Regresyon Temelleri

NumPy’de kovaryans nasıl hesaplanır ve neyi ifade eder?

Cevap: np.cov fonksiyonu değişkenler arasındaki ortak değişim miktarını ölçer. Kovaryans matrisi PCA, çok değişkenli istatistik, portföy teorisi ve regresyon modellerinin temel bileşenidir. Matrisin diyagonal elemanları varyans, off-diagonal elemanları değişken çiftlerinin kovaryansıdır.


Korelasyon matrisi nasıl elde edilir?

Cevap: Korelasyon = kovaryansın standart sapmalara bölünmüş hâlidir. NumPy’de np.corrcoef ile hesaplanır. Bu matris, değişkenlerin doğrusal ilişkilerini ölçekten bağımsız şekilde gösterir. Veri keşfi, özellik seçimi ve risk analizi için kritik bir araçtır.


Doğrusal regresyon parametreleri NumPy ile nasıl elde edilir?

Cevap: Regresyon denklemi β = (XᵀX)⁻¹ Xᵀ y formülüyle çözülür. Bu işlem np.linalg.pinv veya np.linalg.solve ile yapılır. Makine öğrenmesi teorisinin temelinde bu çözüm vardır. NumPy bu hesaplamaları BLAS/LAPACK hızında gerçekleştirir.


NumPy ile varyans ve standart sapma hesaplamalarında dikkat edilmesi gereken parametre nedir?

Cevap: ddof parametresi. Varsayılan ddof=0 popülasyon varyansı verir; örnek varyansı için ddof=1 gerekir. Bilimsel araştırmalarda genellikle ddof=1 kullanılır. Bu nüans yanlış raporlamalara yol açabileceğinden önemlidir.


Histogram hesaplamaları NumPy’de nasıl yapılır?

Cevap: np.histogram veriyi belirli aralıklara (bin) bölerek frekans dağılımı çıkarır. Veri keşfi, yoğunluk tahmini ve görselleştirme öncesi hazırlık için kritik bir adımdır. Bin sayısı seçimi (Sturges, Freedman-Diaconis) dağılımın doğru temsil edilmesi için önemlidir.


Bölüm 16 – Veri Yapıları Arası Dönüşüm, Dosya İşlemleri ve Dış Kaynaklarla Entegrasyon

NumPy dizileri listelere nasıl dönüştürülür ve bu işlem maliyetli midir?

Cevap: ndarray.tolist() fonksiyonu NumPy dizisini Python listesine dönüştürür. Ancak bu işlem her eleman için Python nesnesi oluşturduğundan maliyetlidir. Büyük dizilerde bellek kullanımını katlar ve performansı düşürür. Veri işleme aşamasında mümkün olduğunca NumPy yapısından çıkmamak en doğru yaklaşımdır.


NumPy dizileri nasıl dosyaya kaydedilir?

Cevap: En yaygın yöntemler:

  • np.save → .npy (tek dizi için)
  • np.savez → .npz (çoklu dizi)
  • np.savetxt → metin temelli formatlar
    .npy formatı en hızlısı ve doğruluk kaybı olmayan metottur. Büyük projelerde model ağırlıkları, ara hesaplamalar veya ön işleme adımları için standarttır.

CSV dosyaları NumPy ile nasıl okunur?

Cevap: np.loadtxt veya daha esnek biçimde np.genfromtxt ile CSV okunabilir. genfromtxt eksik değerler (nan), farklı ayraçlar ve dtype karışıklıkları için daha dayanıklıdır. Ancak çok büyük CSV’lerde Pandas daha verimli olabilir.


NumPy ile JSON formatı doğrudan desteklenir mi?

Cevap: JSON biçimi yalnızca temel Python tiplerini destekler (list, dict vb.). NumPy dizileri JSON’a gömülmeden önce listeye dönüştürülmelidir. Ancak bu hem performans hem bellek için zayıf bir yaklaşımdır. Büyük verilerde HDF5, Parquet veya NumPy’nin kendi .npy formatları tercih edilmelidir.


NumPy ve Pandas birlikte nasıl en verimli şekilde kullanılır?

Cevap: Pandas veri okuma, temizleme ve etiketli veri yönetimi için iyidir; NumPy ise yoğun sayısal işlemlerde daha hızlıdır. Tipik akış:

  • Veri Pandas ile okunur
  • Sayısal kolonlar NumPy’ye aktarılır
  • Ağır hesaplamalar NumPy’de yapılır
  • Sonuç tekrar DataFrame’e çevrilir
    Bu hibrit yaklaşım veri biliminde standarttır.

Bölüm 17 – Büyük Veri, Paralel İşleme, GPU ve Performans İyileştirme

NumPy neden tek çekirdekli çalışır?

Cevap: NumPy’nin ana hesaplamaları BLAS/LAPACK üzerinden yapılır. Bu kütüphaneler çok çekirdek destekleyebilir; ancak NumPy’nin Python tarafındaki işlemleri Global Interpreter Lock (GIL) nedeniyle tek çekirdeklidir. Büyük matris çarpımlarında BLAS sayesinde paralellik mümkündür; ancak saf Python seviyesinde paralellik yoktur.


NumPy ile paralel işleme nasıl yapılır?

Cevap: Doğrudan NumPy içinde değil, Python’ın multiprocessing modülüyle yapılır. Büyük veri birden fazla proses arasında bölünür ve NumPy her proseste bağımsız hesaplama yapar. Ara sonuçlar birleştirilir. Bu yaklaşım özellikle büyük matrisler ve veri parçalama (chunking) için kullanılır.


NumPy GPU hızlandırma destekler mi?

Cevap: NumPy doğrudan GPU desteklemez. Ancak sözdizimi NumPy ile tam uyumlu olan CuPy, GPU üzerinde NumPy hızının yüzlerce katına ulaşabilir. Derin öğrenme öncesi, görüntü işleme ve matris ağırlıklı görevlerde CuPy güçlü bir alternatiftir.


Numba ile NumPy nasıl hızlandırılır?

Cevap: @njit dekoratörü ile Python fonksiyonları JIT-compile edilir ve NumPy kodu makine diline çevrilir. Bu özellikle döngülü işlemler için dramatik hız sağlar. NumPy + Numba kombinasyonu CPU tabanlı bilimsel hesaplamalarda son derece etkilidir.


Bellek eşlemeli (memory-mapped) diziler ne zaman zorunludur?

Cevap: Çok büyük veri setlerinin RAM’e sığmadığı durumlarda kullanılır. np.memmap yalnızca gerekli kısmı diskteki dosyadan çeker. Bu teknik, görüntü veri tabanları, astronomi verileri ve yüksek çözünürlüklü zaman serileri gibi devasa veri kaynakları için vazgeçilmezdir.



Bölüm 18 – Gelişmiş Hatalar, Debugging Teknikleri ve Test Edilebilirlik

Floating-point hataları NumPy’de nasıl tespit edilir?

Cevap: np.seterr(all='raise') ile floating-point hataları exception’a dönüştürülebilir. Bu sayede overflow, underflow, division-by-zero gibi hatalar sessizce kaybolmaz, doğrudan test aşamasında yakalanır. Bilimsel hesaplamalar için kritik bir uygulamadır.


NumPy işlemleri neden bazen farklı platformlarda farklı sonuç verir?

Cevap: BLAS/LAPACK varyasyonları (MKL, OpenBLAS), CPU mimarisi ve floating-point optimizasyonları sistemler arası farklılık yaratabilir. Özellikle SVD, eigen ve çözüm algoritmaları platforma göre çok küçük farklarla değişebilir. Bu durum numerik algoritmalarda normaldir.


Copy–view hatalarını önlemenin en iyi yolu nedir?

Cevap: array.flags['OWNDATA'] kontrol edilerek dizinin kendi belleğine sahip olup olmadığı anlaşılabilir. Ayrıca karmaşık dilimleme işlemlerinde copy() açıkça çağrılarak hatalı güncellemeler engellenir. Bilimsel projelerde test edilmeden view kullanmak risklidir.


Tip dönüşümlerinde (astype) sessiz veri kaybı yaşanabilir mi?

Cevap: Evet. Örneğin float → int dönüşümünde kesirli kısım kaybolur. int16 gibi küçük tamsayı türlerinde overflow oluşabilir. NumPy dönüşümlerde uyarı vermez; bu nedenle dtype seçiminde test yapmak gereklidir.


NumPy kodu nasıl test edilir?

Cevap: pytest + numpy.testing kombinasyonu en doğru yaklaşımdır. assert_allclose, assert_array_equal gibi fonksiyonlar sayısal karşılaştırmalar için optimize edilmiştir. Yüzer nokta hesaplamalarında tolerans (rtol, atol) belirlemek önemlidir.



Bölüm 19 – Uygulama Örnekleri, Modelleme ve Bilimsel Kullanım Senaryoları

NumPy fizik simülasyonlarında nasıl kullanılır?

Cevap: Parçacık pozisyonları, hız vektörleri ve kuvvet hesaplamaları tensörler halinde saklanır ve vektörleştirilmiş işlemlerle güncellenir. Bu yapı klasik mekanik, akışkanlar mekaniği ve moleküler dinamik simülasyonlarının temelidir.


Makine öğrenmesinde NumPy’nin rolü nedir?

Cevap: Eğitim öncesi veri hazırlama, normalizasyon, matris çarpımları, hipotez hesaplamaları ve temel optimizasyon adımlarında NumPy kullanılır. scikit-learn gibi kütüphaneler içsel olarak NumPy’yi temel alır. NumPy, ML projelerinin altyapı taşıdır.


Derin öğrenme kütüphaneleri neden NumPy API’sini taklit eder?

Cevap: NumPy API öğrenme kolaylığı sağlar ve geliştiriciler için tanıdık bir arabirimdir. PyTorch, TensorFlow, JAX gibi kütüphaneler NumPy ile uyumlu tasarlanarak araştırmacıların CPU–GPU arasında kolay geçiş yapabilmesini sağlar.


Monte Carlo simülasyonlarında NumPy neden vazgeçilmezdir?

Cevap: Milyonlarca rastgele örnek oluşturarak dağılım tahmini, finansal risk ölçümü, fiziksel süreç benzetimi gibi görevlerde NumPy’nin random ve vektörleştirilmiş fonksiyonları olağanüstü performans sunar.


Doğa bilimlerinde veri analizi neden NumPy üzerine kuruludur?

Cevap: Fizik, kimya, astronomi ve biyoinformatiğin büyük bölümü matris-tensör tabanlı hesaplama gerektirir. NumPy’nin hızlı C tabanlı motoru bu alanlarda standart hale gelmiştir. Birçok bilimsel yazılım NumPy dizilerini I/O formatı olarak kabul eder.



Bölüm 20 – En İyi Uygulamalar, Kod Stili, Tasarım Prensipleri ve Uzun Ömürlü Projeler

NumPy kodu yazarken en önemli stil kuralı nedir?

Cevap: Vektörleştirilmiş işlem tasarlamak. Döngü, liste üretimi, tek tek eleman işlemek yerine “tüm dizi üzerinde işlem” yaklaşımı temel kuraldır. Bu hem okunabilirliği hem hızı katlar.


Büyük projelerde dtype stratejisi nasıl belirlenir?

Cevap: Hassas hesaplamalarda float64, büyük veri + hafıza optimizasyonu gereken yerlerde float32, sayım verilerinde int32/int16 tercih edilir. Dtype tutarlılığını korumak hataları azaltır. Veri seti büyüdükçe dtype seçimi performansı dramatik etkiler.


NumPy ile yazılmış bir fonksiyon nasıl daha okunabilir hale getirilir?

Cevap:

  • Değişken adları matematiksel kavramlarla uyumlu olmalı
  • Ara hesaplamalar anlamlı satırlara bölünmeli
  • Karmaşık broadcasting işlemleri açıklayıcı yorumlarla desteklenmeli
  • einsum kullanılıyorsa işlem denklemi belirtilmeli
    Bu stil araştırma projelerinde önemlidir.

NumPy tabanlı projeler nasıl sürdürülebilir olur?

Cevap: Kodun modüler yazılması, testlerin otomatik olması, dtype ve bellek yönetimi politikalarının belirlenmesi, veri formatlarının standartlaştırılması ve dokümantasyonun güncel tutulması projeyi uzun ömürlü yapar. Büyük Ar-Ge projelerinde bu uygulamalar kritik rol oynar.


NumPy öğrenmenin en verimli yolu nedir?

Cevap:

  1. Küçük dizi manipülasyonlarıyla başlamak
  2. Fonksiyonların davranışını test ederek stride, view, axis gibi kavramları öğrenmek
  3. Matris ve tensör örnekleri çözmek
  4. Gerçek dünya veri setleri üzerinde PCA, regresyon, sinyal işleme gibi uygulamalar yapmak
    Bu yol, NumPy’i teoriden pratiğe tam kapsamlı öğretir.

Eğitimlerimize katılarak bu ve diğer projeleri uygulamalı olarak öğrenebilirsiniz. Eğitimlerimize ve diğer bilgilere buradaki linkten (https://www.facadium.com.tr/) ulaşabilirsiniz.