Veri Bilimi İçin Python -2 |Python ile Veri Analizi: NumPy

Büşra Sulukan
9 min readDec 2, 2023

1.NumPy Nedir?

NumPy, Python programlama dili için çok boyutlu diziler ve bu diziler üzerinde çalışan bir matematiksel işlemler kütüphanesidir.

NumPy’ın işleyiş biçimine geçmeden önce temel ögelerini bilmekte fayda vardır. Bunlar:

1.ndarray (N-dimensional array): ndarray, NumPy kütüphanesinde bulunan bir veri yapısıdır. Bu veri yapısı çok boyutlu dizileri temsil eder, veri manipülasyonu ve matematiksel işlemler için optimize edilmiştir ve NumPy kütüphanesinin temelini oluşturur. Bu diziler, aynı türdeki verileri depolamak ve üzerinde hızlı işlemler yapmak için kullanılır.Genel olarak, NumPy’da temel veri tipi ndarray’dir ve çoğu durumda bu veri tipiyle çalışmak yeterlidir.

Tek Boyutlu ve Çok Boyutlu NumPy Dizileri
  • Tek Boyutlu Dizi (1D Array): Basitçe bir satırdan veya bir sütundan oluşan bir diziyi ifade eder.

Örnek:Vektörler tek boyutlu dizilerdir.

  • İki Boyutlu Dizi (2D Array): Satır ve sütunlardan oluşan bir düzlemdeki bir diziye karşılık gelir.

Örnek: Matrisler ve tablolar iki boyutlu dizilerdir.

  • Üç Boyutlu Dizi (3D Array): Bir dizi içeren dizilerden oluşan bir yapıya karşılık gelir.

Örnek: Birçok iki boyutlu diziden oluşan bir küp. (Veri hacmi veya görüntü gibi üç boyutlu yapıları temsil ederler. )

2. numpy.datetime64 ve numpy.timedelta64: NumPy kütüphanesi tarih ve zaman işlemleri için numpy.datetime64 ve numpy.timedelta64 isimleri ile adlandırılan veri tiplerine sahiptir. Veri bilimcileri tarafından bu veri tipleri, özellikle zaman serisi verileri üzerinde çalışırken kullanışlıdır.

date = np.datetime64('2023-01-01')
time_difference = np.timedelta64(5, 'D')

3. numpy.chararray: NumPy kütüphanesinin bir diğer sahip olduğu dizi türü ise numpy.chararray’dir. Bu dizi türü, karakter dizileri üzerinde çalışmayı sağlayan özel bir yapıya sahiptir.

char_array = np.array(['a', 'b', 'c'], dtype='S')

2. Veri Bilimcilerinin Yararlandığı NumPy Kütüphanesi Avantajları Nelerdir?

Veri bilimcileri, NumPy kütüphanesinin avantajlarından yararlanmak için bu kütüphaneyi kullanmayı sıklıkla tercih ederler.NumPy Kütüphanesinin sahip olduğu avantajlar aşağıdaki gibidir.

a)Hız ve Performans: Klasik bir Python döngüsü ile bir vektör veya matris üzerinde işlem yapmak yerine, NumPy’nin sağladığı vektörize edilmiş operasyonlar kullanılarak tüm veri kümesi üzerinde paralel hesaplamalar yapılır. Bu, işlemleri daha hızlı ve daha etkili hale getirir çünkü altta yatan C dilindeki optimizasyonları kullanır ve tekrarlayan işlemleri azaltır. Tekrarlayan işlemlerin azaltılması, performans artışına neden olur. Daha hızlı ve yüksek performanslı işlemler döndürmesinden dolayı listelerde çalışmaya kıyasla NumPy kütüphanesinde çalışmak veri bilimcileri tarafından sıklıkla tercih edilir.

b)Çok Boyutlu Diziler ve Matematiksel İşlevler: NumPy’nin matematiksel işlevlerle entegre çalışması, lineer cebir, istatistik ve diğer matematiksel operasyonların çalışmasını kolaylaştırır. Çok boyutlu diziler ve vektörize edilmiş işlemler kullanarak, veri bilimcileri büyük veri setleri üzerinde hızlı ve etkili hesaplamalar yapabilirler.

c)Broadcasting: Broadcasting, NumPy’de farklı şekillerdeki diziler üzerinde işlemler yapmayı kolaylaştıran bir özelliktir. Bu özellik , boyutları otomatik olarak uyumlu hale getirerek ve gerekirse veriyi kopyalamadan işlemleri gerçekleştirerek performansı artıran bir diğer özelliktir. Veriyi gereksiz yere kopyalamadan, belleği verimli bir şekilde yönetmesi büyük veri setleri üzerinde çalışırken bellek kullanımını optimize eder ve avantaj sağlar.

d) Çok Boyutlu Diziler: Çok boyutlu diziler (iki boyutlu dizi, üç boyutlu dizi), matematiksel ve bilimsel hesaplamalarda sıkça kullanılan bir veri yapısıdırlar. Bu dizilerin etkili bir şekilde yönetilmesi NumPy’nin güçlü yanlarından biridir.

Bu sayılan özelliklerin hepsi Veri Bilimcilerin NumPy kütüphanesini tercih etme sebepleri olarak karşımıza çıkar.

3. NumPy Kurulumu ve İmport Aşaması

Jupyter Notebook’ da diğer tüm kütüphanelerde olduğu gibi Numpy ‘ın kurulumu çok kolaydır. Aşağıdaki kod çalıştırılarak kütüphane kurma işlemi tamamlanır. Bu işlem adımı sadece daha önce hiç kullanılmayan, hali hazırda yüklü olmayan kütüphaneler için yapılır.

pip install numpy

Bu işlemden sonra kütüphane projeye dahil edilmek üzere import edilir.

import numpy as np

Yukarıdaki kod bloğu NumPy kütüphanesini çalışma dizinimize çağırır(import eder) ve ”as” kısmından sonra yazılan “np” ise bir alias’tır(takma ad).Bu işlemi yapma nedenimiz çalışmanın diğer adımlarında NumPy’yi uzun yazarak değil de “np” diye basitçe çağırmak istememizdir.Genellikle NumPy ‘yi “np” diye kısaltarak kullanılır.

4. NumPy Dizileri Oluşturma

Bir NumPy array oluşturmak için, array() fonksiyonu kullanılır.Bu işlem için bir listeyi, tuple’ı veya herhangi bir dizi benzeri nesne fonksiyonla beraber kullanarak ndarray’e dönüştürülebilir.

örnek:

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

print(arr)

4.1. Skalar(0D Array) Oluşturma

0D dizileri veya Skalarlar, bir dizideki ögelerdir. Bir dizinin içinde barındırdığı her değer bir 0D dizisidir.

arr2 = np.array(99)

print(arr2)

4.2. Tek Boyutlu Diziler Oluşturma

arr3 = np.array([4, 8, 12, 16, 20])

print(arr3)

4.3. İki Boyutlu Diziler Oluşturma

arr4 = np.array([ [3, 4, 5], [8, 12, 16]])

print(arr4)

4.4.Üç Boyutlu Diziler Oluşturma

arr5 = np.array([ [ [1, 2, 3], [4, 5, 6]], [ [7, 8, 9], [10, 11, 12] ] ])

print(arr5)

4.5. Dizilerin Boyut Sayısını Gösterme

NumPy dizileri, ndim özelliğine sahiptir. ndim bizlere dizilerin kaç boyuta sahip olduğunu gösterir.

a = np.array(96)

print(a.ndim) # 0 Boyutlu Dizi
b = np.array([1, 2, 3, 4, 5])

print(b.ndim) # 1 Boyutlu Dizi
c = np.array([ [1, 2, 3], [4, 5, 6] ])

print(c.ndim) #2 Boyutlu Dizi
d = np.array([ [ [1, 2, 3], [4, 5, 6] ], [ [1, 2, 3], [4, 5, 6] ] ])
print(d.ndim) # 3 Boyutlu Dizi

5.NumPy Dizileri İndexleme (Dizi Öğelerine Erişme)

5.1.İndex Nedir?

İndexler, Python’daki bir liste veya NumPy dizisinde her öğenin konumunu belirler.0'dan başlayarak eleman sayısının bir eksiği kadar (0'dan başladığı için)değer alırlar.

Not: İndexlerin 0'dan başladığı unutulan bir kavramdır fakat indexlerin bu özelliği oldukça önemlidir.

Dizi indexleme, bir dizi öğesine erişim anlamına gelir. Bir dizi öğesine, dizin numarasına başvurarak erişilir. “[ ]” içine ulaşmak istenilen index numarası yazılarak ilgili indexe ulaşılır.

Örnek:

arr6 = np.array([1, 2, 3, 4])

print(arr6[0]) #İlk elemana ulaşmak için sıfırıncı index getirilir.

2 boyutlu dizilerden öğelere erişmek için, öğenin boyutunu ve dizinini temsil eden virgülle ayrılmış tamsayılar kullanılır.

arr7 = np.array([ [1,2,3,4,5], [6,7,8,9,10] ])

print(arr7[0, 1]) # 1. boyuttaki 2.elemana ulaşmak için indexleme

3 boyutlu dizilerden öğelere erişmek için yine aynı virgülle ayırma işlemi yapılır ve indexler yazılır.

arr8 = np.array([ [ [1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12] ] ])

print(arr8[0, 1, 2]) #sonucu 6 çıkacak olan indexleme işlemi

Buraya kadar indexleme işlemini hep dizilerimizin başından başlatarak yaptık ama bu indexleme işlemi sondan başlanarak da yapılabilir.

arr9 = np.array([1,2,3,4,5,6,7,8,9,10])

print(arr9[-1]) #sonuncu indexi çağırır
arr10 = np.array([ [1,2,3,4,5], [6,7,8,9,10] ])

print( arr10[1, -1]) #2.boyuttaki son öğe

6. NumPy Dizileri Dilimleme (Slicing)

NumPy dizilerinde dilimleme (slicing), bir diziden belirli bir alt dizi veya alt matrisi seçmek için kullanılan bir işlemdir. NumPy dilimleme, Python listelerindeki dilimlemeyle benzerdir, ancak çok boyutlu dizilerde daha güçlü ve esnek bir şekilde çalışır.

Dilimleme işlemi, bir dizinin belirli bir aralığını seçmek veya belirli bir konumdaki öğeleri almak için kullanılabilir.

Örnek:

arr11 = np.array([ [1, 2, 3, 4, 5], [6, 7, 8, 9, 10] ])

print(arr11[1, 1:4]) # [7 8 9] sonucunu döndüren slicing işlemi

Örnek:

arr12 = np.array([ [1, 2, 3, 4, 5], [6, 7, 8, 9, 10] ])

print(arr12[0:2, 2]) # Her iki boyutta da 2.indexleri slicing yapar[3 8]

7.NumPy Dizi Kopya (Copy) İşlemi

NumPy dizilerinde işlemler yapmak istediğimizde orjinal dizinde yapmak yerine kopyasını elde ederek işlem yapmak tercih edilen yöntemdir.Bunun nedeni kopyada yapılan herhangi bir değişikliğin orijinal diziyi etkilememesi ve orijinal dizide yapılan herhangi bir değişikliğin de kopyayı etkilememesidir.

Örnek:

arr13 = np.array([1, 2, 3, 4, 5])
x = arr13.copy() #Dizinin kopyasını aldık
arr13[0] = 42 #Orjinal dizine 42 ekledik

print(arr13) # [42 2 3 4 5] #Orjinal dizine 42 eklendi
print(x) # [1, 2, 3, 4, 5] #Kopya dizine 42 eklenmedi.

8. NumPy Dizi Şekli (Shape)

Dizinin şekli, dizinin boyutlarından oluşan bir demet olarak ifade edilir ve dizinin yapısını anlamak, diziyi manipüle etmek ve uyumlu işlemler yapmak için önemlidir.

Örnekler:

# 1D Dizi Şekli 
arr_1d = np.array([1, 2, 3, 4, 5])
print(arr_1d.shape) # Çıktı: (5,)
# 2D Dizi Şekli
arr_2d = np.array([ [1, 2, 3], [4, 5, 6] ])
print(arr_2d.shape) # Çıktı: (2, 3) # İki satır, üç sütun
#3D Dizi Şekli
arr_3d = np.array([ [ [1, 2], [3, 4]], [[5, 6], [7, 8] ] ])
print(arr_3d.shape)
# Çıktı: (2, 2, 2) # İki blok, her biri iki satır ve iki sütun
# Dizi Şeklini Değiştirme
arr14= np.array([1, 2, 3, 4, 5, 6])
reshaped_arr = arr14.reshape((2, 3)) # Diziyi 2x3 şekline dönüştürme
print(reshaped_arr.shape) # Çıktı: (2, 3)

9.NumPy Dizileri Yineleme (Iterating)

9.1.Döngü İle Yineleme (Iterating)

Yineleme (Iterating), öğeleri tek tek gözden geçirmek anlamına gelir. Numpy’deki çok boyutlu dizilerle uğraşırken, bunu python döngüsünün temel for döngüsünü kullanarak yapabiliriz.

Örnek:

arr15 = np.array([1, 2, 3])
for x in arr15:
print(x)
# Çıktılar:
# 1
# 2
# 3

9.2.nditer() Kullanarak Dizileri Yineleme

For döngülerinde, bir dizinin her skaleri için n adet for döngüsü kullanmamız gerekir ki bu da çok yüksek boyutsallığa sahip diziler için yazmayı zorlaştırır. Fakat nditer() kullanarak bu işlemi basitçe gerçekleştirebiliriz.

Örnek:

arr16= np.array([ [ [1, 2], [3, 4]], [[5, 6], [7, 8] ] ])
for x in np.nditer(arr):
print(x)
# Çıktılar:
# 1
# 2
# 3
# 4
# 5
# 6
# 7
# 8

10.NumPy Dizilerini Birleştirme (Join)

Birleştirme, iki veya daha fazla dizinin içeriğini tek bir dizide birleştirmek anlamına gelir. SQL’de tabloları bir anahtara dayalı olarak birleştirdiğimiz gibi NumPy kütüphanesinde ise dizileri eksenlere(axis) göre birleştirebiliriz. Boyutla birlikte concatenate() işlevine birleştirmek istediğimiz bir dizi diziyi iletiriz. Boyut açıkça geçirilmezse 0 olarak alınır.

Örnek:

arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])
arr = np.concatenate((arr1, arr2))
print(arr)
# [1 2 3 4 5 6]
arr1 = np.array([[1, 2], [3, 4]])
arr2 = np.array([[5, 6], [7, 8]])

arr = np.concatenate((arr1, arr2), axis=1)

print(arr)

# [[1 2 5 6]
# [3 4 7 8]]

11. NumPy Dizilerini Bölme(Split)

Bölme veya parçalama (split), birleştirme işleminin tersi işlemidir. Birleştirme, birden çok diziyi tek bir dizide birleştirirken bölme, bir diziyi birden çok diziye böler.

array_split() fonksiyonunu kullanırız ve bölmek istediğimiz dizi ile bölme sayısını iletiriz.

Örnek:

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

newarr = np.array_split(arr17, 3)

print(newarr)

# [array([1, 2]), array([3, 4]), array([5, 6])]
#2 Boyutlu Dizileri Bölme
arr18 = np.array([[1, 2], [3, 4], [5, 6], [7, 8], [9, 10], [11, 12]])

newarr = np.array_split(arr18, 3)

print(newarr)
# Çıktı:
# [array([[1, 2], [3, 4]]),
# array([[5, 6], [7, 8]]),
# array([[9, 10], [11, 12]])]

12. NumPy Dizileri Sıralama (Sort() )

Sıralama,öğeleri sıralı bir şekilde yeniden düzenlemek anlamına gelir. sort() metodu ile bu sıralama işlemi gerçekleştirilir.

Örnek:

arr19 = np.array([3, 2, 0, 1])
print(np.sort(arr19)) # [0 1 2 3]

Not1: Bu yöntem, orjinal diziyi değiştirmeden bırakarak dizinin bir kopyasını döndürür.

  • Sort() metodu, string dizilerini alfabetik olarak sıralar.

Örnek:

arr20 = np.array(['banana', 'cherry', 'apple'])

print(np.sort(arr20)) # ['apple' 'banana' 'cherry']
  • Sort() metodu,boolean dizileri ise 0/1 durumuna göre sıralar.

Örnek:

arr21 = np.array([True, False, True])

print(np.sort(arr21)) [False True True]

13.NumPy Kütüphanesi İle Basit Matematiksel İşlemler

13.1.Toplama İşlemi (Addition)

Toplama işlemi, iki dizinin içeriğini toplar ve sonuçları yeni bir dizide döndürür.

add() fonksiyonu ile doğrudan uygulanır.

arr1 = np.array([10, 11, 12, 13, 14, 15])
arr2 = np.array([20, 21, 22, 23, 24, 25])
newarr = np.add(arr1, arr2)
print(newarr) # [30 32 34 36 38 40]

13.2. Çıkarma İşlemi (Subtraction)

Çıkarma işlemi, bir dizideki değerleri başka bir dizideki değerlerle çıkarır ve sonuçları yeni bir dizide döndürür.

subtract() fonksiyonu ile doğrudan uygulanır.

arr1 = np.array([10, 20, 30, 40, 50, 60])
arr2 = np.array([20, 21, 22, 23, 24, 25])
newarr = np.subtract(arr1, arr2)
print(newarr) # [-10 -1 8 17 26 35]

13.3 Çarpma İşlemi (Multiplication)

Çarpma işlemi, bir dizideki değerleri başka bir dizideki değerlerle çarpar ve sonuçları yeni bir dizide döndürür.

multiply() fonksiyonu ile doğrudan uygulanır.

arr1 = np.array([10, 20, 30, 40, 50, 60])
arr2 = np.array([20, 21, 22, 23, 24, 25])
newarr = np.multiply(arr1, arr2)
print(newarr) # [200 420 660 920 1200 1500]

13.4 Bölme İşlemi(Division)

Bölme işlemi, bir dizideki değerleri başka bir dizideki değerlerle böler ve sonuçları yeni bir dizide döndürür.

divide() fonksiyonu ile doğrudan uygulanır.

arr1 = np.array([10, 20, 30, 40, 50, 60])
arr2 = np.array([3, 5, 10, 8, 2, 33])
newarr = np.divide(arr1, arr2)
print(newarr) # [ 3.33333333 4. 3. 5. 25. 1.81818182]

13.5 Üs Alma İşlemi (Power)

Üs alma işlemi, değerleri birinci diziden ikinci dizinin değerlerinin üssüne yükseltir ve sonuçları yeni bir dizide döndürür.

power() fonksiyonu ile doğrudan uygulanır.

arr1 = np.array([10, 20, 30, 40, 50, 60])
arr2 = np.array([3, 5, 6, 8, 2, 33])
newarr = np.power(arr1, arr2)
print(newarr) # [1000 3200000 729000000 -520093696 2500 0]

NOT: Power() fonksiyonunda ön tanımlı değer integer olduğu için sonucu integer aralığını geçen sayılarda beklenmedik sonuçlar karşımıza çıkar.Bunu önlemek için aşağıdaki işlem yapılır.

arr1 = np.array([10, 20, 30, 40, 50, 60], dtype=float)
arr2 = np.array([3, 5, 6, 8, 2, 33], dtype=float)
newarr = np.power(arr1, arr2)
print(newarr) # [1.00000000e+03 3.20000000e+06 7.29000000e+08 6.55360000e+12 2.50000000e+03 4.77519667e+58]

13.6 Kalan veya Mod Alma İşlemi (Remainder)

Hem mod() hem de remainder() fonksiyonları, ikinci dizideki değerlere karşılık gelen birinci dizideki değerlerin kalanını döndürür ve sonuçları yeni bir dizide döndürür.

arr1 = np.array([10, 20, 30, 40, 50, 60])
arr2 = np.array([3, 7, 9, 8, 2, 33])
newarr = np.mod(arr1, arr2)
#newarr = np.remainder(arr1, arr2) ile de aynı işlem sonucu elde edilir.
print(newarr) # [1 6 3 0 0 27]

13.7 Bölüm ve Mod İşlemi (Quotient and Mod)

divmod() fonksiyonu hem bölümü hem de modu döndürür. Dönüş değeri iki dizidir, birinci dizi bölümü içerir ve ikinci dizi modu içerir.

arr1 = np.array([10, 20, 30, 40, 50, 60])
arr2 = np.array([3, 7, 9, 8, 2, 33])
newarr = np.divmod(arr1, arr2)
print(newarr)
# (array([ 3, 2, 3, 5, 25, 1]), array([ 1, 6, 3, 0, 0, 27]))
# ilk dizi bölüm,ikinci dizi mod.

13.8 Mutlak Değer(Absolute)

Hem absolute() hem de abs() fonksiyonları, eleman bazında aynı mutlak işlemi yapar, ancak python’un dahili math.abs() fonksiyonu ile karışıklığı önlemek için absolute() kullanımı tercih edilir.

arr = np.array([-1, -2, 1, 2, 3, -4])
newarr = np.absolute(arr)
print(newarr) # [1 2 1 2 3 4]

Dip Not: NumPy kütüphanesinin daha fazla matematiksel operasyonları ve özelliği mevcuttur. Veri bilimciler genellikle NumPy kütüphanesini ve özelliklerini tek başına kullanmaktan ziyade Pandas kütüphanesi ile beraber NumPy dizilerini (array) kullanarak gerekli veri bilimi projelerini yürütürler.Bu nedenle bu yazımda NumPy derinlemesine değil genel hatlarıyla ele alınmıştır.

Veri Bilimi İçin Python Serisi:

1) Veri Bilimi İçin Python -1. 1.GİRİŞ | by Büşra Sulukan | Dec, 2023 | Medium

--

--