NumPy'de dizi ve matris işlemleri: oluşturma, şekil değiştirme, çarpma
Beceri rehberi

NumPy'de dizi ve matris işlemleri: oluşturma, şekil değiştirme, çarpma

Hazırlayan: Mindset Institute EditörlüğüGüncellendi: 7 dk okuma

NumPy ile dizi oluşturma, reshape, eksen mantığı, birleştirme ve matris çarpımını kısa kod örnekleriyle öğrenin; sık görülen hataları tanıyın.

NumPy dizisi (ndarray) neyi farklı yapar?

NumPy'nin temel veri yapısı ndarray, aynı türden elemanları sabit şekilli bir ızgarada tutar. Python listesinden farkı, her elemanın aynı türde olması ve verinin bitişik bellekte durmasıdır. Bu yüzden toplama, çarpma, karşılaştırma gibi işlemler döngü yazmadan bütün dizi üzerinde çalışır ve çok daha hızlıdır.

Bir diziyi tanımlayan temel özellikler şunlardır: shape (her eksendeki boyut), ndim (eksen sayısı) ve dtype (eleman türü). Dizi işlemlerinde yaşanan hataların büyük kısmı bu özelliklerin yanlış anlaşılmasından gelir. Bir diziyle çalışmaya başlarken ilk yapılacak iş bu özelliklere bakmaktır.

import numpy as np a = np.array([[1, 2, 3], [4, 5, 6]]) print(a.shape, a.ndim, a.dtype)

Burada a, satır ve sütundan oluşan, satır-sütun düzeninde bir dizidir; shape (2, 3) çıkar. Satırlar birinci eksendir, sütunlar ikinci eksen. Bu eksen sıralaması sum, mean ve birleştirme işlemlerinin tamamına yön verir.

Dizi oluşturma yolları

Dizi oluşturmanın birkaç yaygın yolu vardır ve her biri farklı bir ihtiyaca yanıt verir:

  • np.array(liste): var olan Python listesinden ya da iç içe listeden dizi üretir. Örnek: np.array([[1, 2, 3], [4, 5, 6]]).
  • np.zeros ve np.ones: şekli verilen, sıfır ya da birlerle dolu dizi. Örnek: np.zeros((2, 3)) ve np.ones((2, 3)). Şekil bir demet olarak verilir; çift parantezin nedeni budur.
  • np.arange: Python'daki range gibi ardışık değerler üretir. Örnek: arange(6) ardışık değerlerden oluşan tek eksenli bir dizi verir.
  • np.linspace: başlangıç ve bitiş arasında eşit aralıklı belirli sayıda nokta üretir; grafik ekseni ve simülasyon için kullanışlıdır.
  • np.eye: birim matris üretir. Örnek: eye(2).
  • np.random modülü: rastgele değerlerle dolu diziler. Tekrarlanabilir sonuç için üreteci bir tohum değeriyle başlatın.

Eleman türünü dtype ile açıkça belirtmek iyi alışkanlıktır. Tam sayı dizisiyle ondalık dizi aynı işlemde farklı davranır ve tür yanlışlığı, yuvarlanmış sonuçlar ya da sessizce bozulmuş veri şeklinde geri döner. Okuma sonrası veri hazırlarken astype ile türü bir kez dönüştürüp sonra çalışmak çoğu sorunu baştan önler.

Şekil değiştirme: reshape, düzleştirme, devrik alma

Aynı veriyi farklı şekillerde okumak gerektiğinde reshape kullanılır. NumPy belgesine göre reshape eleman sayısını korur; yeni şekil, toplam eleman sayısıyla uyumlu olmalıdır. Örneğin arange(6) ile üretilen dizi (2, 3) ya da (3, 2) şekline getirilebilir; ama eleman sayısına tam bölünmeyen bir satır sayısı verirseniz NumPy hata döndürür.

b = np.arange(6).reshape(2, 3) c = b.reshape(3, -1)

İkinci satırdaki -1, belgeye göre "bu boyutu diğerlerinden ve toplam eleman sayısından çıkar" demektir. Burada sonuç (3, 2) olur. Yalnızca bir boyut -1 olabilir ve toplam eleman sayısı diğer boyutların çarpımına tam bölünmelidir.

Belgeye göre reshape mümkün olduğunda yeni bir görünüm (view) döndürür, aksi halde kopya üretir. Yani görünüm üzerinde yapılan değişiklik özgün diziyi de etkileyebilir. Kesin kopya gerekiyorsa copy() kullanın.

Diğer sık şekil işlemleri: ravel ve flatten çok eksenli diziyi tek eksene düzleştirir (ravel mümkünse görünüm, flatten her zaman kopya döndürür). b.T ya da np.transpose, satır ve sütunları değiştirir; (2, 3) şekilli dizi (3, 2) olur. np.newaxis ya da reshape ile tek boyutlu eksen eklemek, sonraki işlemlerde şekil uyumu için gerekir.

Dizileri birleştirmek ve bölmek

Dizileri tek dizi yapmak için yönü bilmek gerekir. Yan yana (sütun yönünde) eklemek için hstack ya da concatenate ile axis=1, alt alta (satır yönünde) eklemek için vstack ya da concatenate ile axis=0 kullanılır.

x = np.array([[1, 2], [3, 4]]) y = np.array([[1, 2], [3, 4]]) alt_alta = np.concatenate([x, y], axis=0) yan_yana = np.concatenate([x, y], axis=1)

Birleştirmede kural basittir: birleştirme ekseni dışındaki bütün eksenlerin boyutu eşit olmalıdır. Aksi halde bir ValueError ile karşılaşırsınız. Hata iletisi hangi şekillerin uyumsuz olduğunu söyler; iletiyi okuyup şekilleri yazdırmak çözümü kolaylaştırır.

Bölme işi için np.split ve np.array_split kullanılır. Veri bilimi çalışmasında eğitim ve test bölmesi gibi işlerde bu işlevleri sık görürsünüz. Satırları rastgele karıştırmak istiyorsanız önce karıştırılmış bir indeks dizisi üretip diziyi bu indekslerle seçmek, ham diziyi yerinde değiştirmekten daha güvenlidir.

Eksen mantığı: toplam, ortalama ve diğer indirgemeler

sum, mean, min, max, std gibi işlevler bir eksen bağımsız değişkeni alır. Eksen verilmezse tüm elemanlar tek değere indirgenir. Eksen verildiğinde o eksen "ezilir", geri kalan eksenler sonuçta kalır.

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

Burada axis=0 satırlar boyunca toplar ve her sütun için bir değer verir (sonuç uzunluğu sütun sayısına eşittir). axis=1 sütunlar boyunca toplar ve her satır için bir değer verir (sonuç uzunluğu satır sayısına eşittir). Akılda kalan kural: Hangi ekseni verirseniz sonuçta o eksen kaybolur.

Satış verisi örneğiyle düşünün: Satırlar ürünler, sütunlar aylar olsun. Aylık toplam için ürünler boyunca toplamak gerekir; ürün bazlı toplam için aylar boyunca. Sonuçların şekline bakarak doğru eksen seçildiğini teyit edin: Beklediğiniz sonuç aylık değerse, uzunluk ay sayısına eşit olmalıdır.

Sonucu aynı şekilde tutmak ve sonraki işlemlerde yayın için kullanmak isterseniz keepdims=True verin; ezilen eksen boyutu bir olarak kalır. Bu, sütun ortalamasını çıkarıp veriyi merkezlemek gibi işlerde pratiktir.

Matris işlemleri: elemanlar arası çarpım ile matris çarpımı

En sık karıştırılan konu, * ile @ arasındaki farktır. NumPy belgesine göre * karşılıklı elemanları çarpar, @ ise (np.matmul ile aynı işi görür) ortak iç boyut üzerinde çarpımların toplamını hesaplar, yani klasik matris çarpımıdır.

m = np.array([[1, 2], [3, 4]]) n = np.eye(2) elemanlar_arasi = m * n matris_carpimi = m @ n

Matris çarpımında iç boyutlar uyuşmalıdır: (2, 3) şekilli bir matris yalnızca ilk boyutu kendi sütun sayısına eşit olan bir matrisle çarpılabilir. Uyuşmazlıkta ValueError verir. Belgeye göre tek eksenli bir dizi ilk argümansa satır, ikinci argümansa sütun matrisi gibi ele alınır ve eklenen eksen sonuçtan çıkarılır; vektörlerin çarpımı bir skalar verir.

Çok eksenli dizilerde matmul son eksenlerini matris olarak kabul eder, geri kalan eksenleri yığın (stack) sayıp birlikte işler. Birçok matrisi tek çağrıyla çarpmak için bu davranıştan yararlanılır. Belge ayrıca matmul'un skalerle çarpıma izin vermediğini, bunun için * kullanılması gerektiğini belirtir.

Doğrusal cebir işlevleri np.linalg altında toplanır: determinant, ters matris, doğrusal denklem sistemi çözümü gibi. Ters almak yerine denklem sistemi çözen işlevi kullanmak sayısal olarak çoğu zaman daha sağlıklıdır. Matrisin tekil olması durumunda bu işlevler hata verir; hatayı yakalayıp veri sorununu araştırmak gerekir.

Sık hatalar ve kontrol listesi

Dizi ve matris işlemlerinde hatalar tekrar eder. Çalışmaya başlamadan şu listeye göz atın:

  • Şekle bakmadan işlem yapmak. İşlemden önce shape yazdırın; (3,) ile (3, 1) aynı şey değildir.
  • Tam sayı dizilerinde sessiz yuvarlama. Tam sayı dizisine ondalık değer atamak değeri kırpar. Yeni dizi yaratırken dtype belirtin.
  • Görünüm ile kopyayı karıştırmak. Dilimleme ve çoğu reshape görünüm döndürür; üzerinde değişiklik yapınca özgün veri de değişir. Bağımsız bir dizi gerekiyorsa copy kullanın.
  • Eksen yönünü ezberlemek. Eksen sıralaması dizinin şekline göre değişir; her kullanımda sonucun şeklini yazdırarak doğrulayın.
  • * ile @ karıştırmak. Elemanlar arası çarpım hata vermez, sadece yanlış sonuç üretir; bu yüzden küçük bir örnekle sınayın.
  • Döngüyle eleman eleman çalışmak. NumPy'nin gücü döngüsüz işlemdir; for ile dolaşmak çoğunlukla yavaş ve uzundur.
  • Rastgele değerlerde tohumsuz çalışmak. Sonuçlar tekrarlanamaz hale gelir.

Pratik bir kural: Her yeni işlemi küçük, elle doğrulanabilir bir diziyle önce deneyin. Sonuç beklediğiniz gibiyse gerçek veriye geçin. Bu alışkanlık, sonradan boyutlar hakkında tahmin yürütmekten çok daha az zaman harcatır.

Bu beceriyi Mindset programlarında nerede çalışırsınız?

Dizi ve matris işlemleri; veri analistleri, mühendisler, finans modelleme ve tahminleme yapan ekipler ve makine öğrenmesine yönelen yazılımcılar için temel bir beceridir. Pandas, scikit-learn ve diğer bilimsel kütüphanelerin altında NumPy dizileri çalışır; bu temeli sağlam kuran kişi üst katmandaki hataları da daha hızlı çözer.

Python NumPy ile Sayısal Hesaplama programının modül başlıkları arasında NumPy temelleri ve dizi yapıları, indeksleme, dilimleme ve yayın, vektörel işlemler ve üniversal fonksiyonlar, doğrusal cebir ve matris işlemleri ile istatistiksel fonksiyonlar bulunur. Pandas ağırlıklı çalışan ekipler için Python ile Veri Analizi (Pandas) programı tablo ve veri hazırlama tarafını tamamlar. Kurumsal bir analitik ekibinde bu programlar, ham dizi işlemleriyle tablo analizini aynı ekip dilinde buluşturmak için birlikte düşünülebilir.

İlgili Mindset programı

Python NumPy ile Sayısal Hesaplama

Sık sorulanlar

Sık sorulan sorular

NumPy dizisi ile Python listesi arasındaki fark nedir?

Python listesi farklı türleri bir arada tutabilir ve elemanları ayrı nesnelerdir. NumPy dizisi tek türde elemanları bitişik bellekte saklar, bütün dizi üzerinde döngüsüz işlem yapar ve çok eksenli şekil kavramı sunar. Sayısal hesaplamada bu yapı hem daha hızlı hem de matris işlemleri için daha uygundur.

(3,) şekilli dizi ile (3, 1) şekilli dizi aynı mıdır?

Hayır. (3,) tek eksenli, yani düz bir vektördür. (3, 1) ise satır sayısı kadar elemanlı tek sütunlu, satır-sütun düzeninde bir dizidir. Birçok işlemde sonuçlar farklı çıkar; özellikle bir dizi ile bir sütun matrisi toplandığında beklenmeyen büyük bir matris oluşabilir. İşlemden önce shape yazdırmak ve gerektiğinde reshape ile ekseni açıkça eklemek bu karışıklığı önler.

axis=0 ve axis=1 ne anlama gelir?

Satır-sütun düzenindeki dizide axis=0 satırlar boyunca, yani yukarıdan aşağıya işlem yapar ve her sütun için bir sonuç verir. axis=1 sütunlar boyunca, yani soldan sağa işlem yapar ve her satır için bir sonuç verir. Hangi ekseni seçerseniz sonuçta o eksen kaybolur.

Matris çarpımı için hangi operatör kullanılır?

Matris çarpımı için @ operatörü ya da np.matmul kullanılır. * operatörü karşılıklı elemanları çarpar ve matris çarpımı değildir. Matris çarpımında soldaki matrisin sütun sayısı sağdaki matrisin satır sayısına eşit olmalıdır, aksi halde NumPy hata verir.

NumPy dizisini kopyalamadan değiştirmek mümkün mü?

Evet. Dilimleme ve çoğu reshape işlemi görünüm döndürür; görünümdeki değişiklik özgün diziyi de değiştirir. Bu belleği korur ama istenmeyen yan etkilere neden olabilir. Özgün veriyi korumak istiyorsanız copy ile açık kopya alın, görünüm olup olmadığını emin değilseniz de kopyalayın.

NumPy Dizi ve Matris İşlemleri: Örneklerle Rehber