Veri Bilimi için Temel Python Kütüphaneleri 1: NumPy

Aysel Aydin
9 min readJul 20, 2022

--

Merhabalar, bu yazıyla beraber günümüzün en popüler alanlarından biri olan veri bilimi için temel Python kütüphanelerini;

  • NumPy
  • Pandas
  • Matplotlib
  • Seaborn
  • Scikit-Learn

sırasıyla ele alıyor olacağız.

Temel Python kütüphaneleri serimize ilk kütüphanemiz olan NumPy ile başlayalım.

  • NumPy (Numerical Python) çok boyutlu diziler ve matrislerle çalışmamızı sağlayan, bilimsel hesaplamaları hızlı bir şekilde yapmamızı sağlayan bir matematik kütüphanesidir.
  • NumPy geleneksel Python listelerinden 50 kata kadar daha hızlıdır.
  • Python listlerinden farklı olarak NumPy dizileri homojen yapıda olmalıdır yani dizi içindeki tüm elemanlar aynı veri tipinde olmalıdır.
  • Codebase olarak kısmen Python’da yazılmıştır ancak hızlı hesaplama gerektiren kısımların çoğu C ya da C++ ile yazılmıştır.

NumPy kütüphanesi Python dilinin doğrudan bir parçası değildir. Bu yüzden ayrıca kurulması ve program içerisinde tanımlanması yani import edilmesi gerekmektedir.

pip install numpy

NumPy kütüphanesini kullanmak için öncelikle bu kütüphaneyi import etmemiz gerekiyor.

import numpy as np

NumPy, daha çok dizilerle çalışmak amacıyla kullanılır. NumPy’daki dizi nesnesine ndarray adı verilir. Array() fonksiyonu kullanılarak bir NumPy ndarray nesnesi oluşturulur.

import numpy as npnd_array = np.array([1,2,4,5,6,7])
print(nd_array)
Output:
[1 2 4 5 6 7]

Bu şekilde bir liste üzerinden ndarray oluşturmuş olduk. Liste gibi tuple, set üzerinden de bir dizi oluşturabiliriz.

import numpy as nptuple_nd = np.array((1,2,4,5,6,7))
print(nd_array)
Output:
[1 2 4 5 6 7]

Dizilerde Boyutlar

0-D Diziler
İçerisinde tek bir değerin bulunduğudizilerdir.

import numpy as npnd_array = np.array(57)
print(nd_array)
Output:
[57]

1-D Diziler
Elemanları 0-D dizileri olan tek boyutlu dizilerdir. Yaygın olarak kullanılan dizilerdir.

import numpy as npnd_array = np.array([1,2,3,4,5,7])
print(nd_array)
Output:
[1 2 3 4 5 7]

2-D Diziler
Elemanları 1-D dizileri olan dizilerdir.

import numpy as npnd_array = np.array([[1,2,3,4,5,7], [2,3,4,5,6,7]])
print(nd_array)
Output:
[[1 2 3 4 5 7]
[2 3 4 5 6 7]]

3-D Diziler
Elemanları 2-D dizileri olan dizilerdir.

import numpy as npnd_array = np.array([[[1,2,3,4,5,7], [2,3,4,5,6,7]], [[1,2,3,4,5,7], [2,3,4,5,6,7]]])
print(nd_array)
Output:
[[[1 2 3 4 5 7]
[2 3 4 5 6 7]]
[[1 2 3 4 5 7]
[2 3 4 5 6 7]]]

Çok Boyutlu Diziler
Bir dizinin herhangi bir sayıda boyutu olabilir. Dizi oluşturulurken ndmin bağımsız değişkenini kullanarak boyut sayısını tanımlayabiliriz.

import numpy as npnd_array = np.array([1,2,3,4,5,7], ndmin=2)
print(nd_array.ndim)
Output:
2

Boyut Sayısını Bulma
ndim özelliği ile bir dizinin kaç boyuta sahip olduğu bilgisini alabiliriz.

import numpy as npnd = np.array(57)
nd_1d = np.array([1,2,3])
nd_2d = np.array([[1,2,3,7], [2,3,4,7]])
nd_3d = np.array([[[1,2,5,7], [2,3,6,7]], [[3,4,5,7], [2,3,4,5]]])
print(nd.ndim)
print(nd_1d.ndim)
print(nd_2d.ndim)
print(nd_3d.ndim)
Output:
0
1
2
3

Dizinin satır ve sütun sayısını bulmak
NumPy array nesnesinin kaç satır ve sütundan oluştuğunu .shape ile öğrenebiliriz. Dönüş olarak bir tuple nesnesi döndürür.

import numpy as npnd_1d = np.array([1,2,3,4,5,7])
nd_2d = np.array([[1,2,3,4,5,7], [2,3,4,5,6,7]])
print("1 boyutlu olan dizi ", nd_1d.shape)
print("2 boyutlu olan dizi ", nd_2d.shape)
Output:
1 boyutlu olan dizi (6,)
2 boyutlu olan dizi (2, 6)

Dizinin satır ve sütun sayısını değiştirmek

NumPy array’i yeniden şekillendirmek istediğimizde yani satır ve sütun sayısını değiştirmek istediğimizde .reshape metodunu kullanırız.

import numpy as npnd_array = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
print(nd_array.shape)
Output:
(10,)
print(nd.reshape(5, 2))Output:
[[0 1]
[2 3]
[4 5]
[6 7]
[8 9]]

Başlangıçta numpy_array nesnemizin şekline baktığımızda(10,) olduğunu görüyoruz ve bu bize numpy_array nesnemizin tek boyutlu bir vektör olduğunu belirtir. reshape(5, 2) metodunu kullandığımızda ise artık numpy_array nesnemiz 5 satır ve 2 sütundan oluşan 5x2 lik 2 boyutlu bir matrise dönüşmüştür.

np.arange()
Python’daki range() fonksiyonuna benzer. Belirtilen başlangıç değerinden başlayıp, her seferinde adım sayısı kadar arttırarak, bitiş değerine kadar olan sayıları bulunduran bir numpy dizisi döndürür.

np.arange(başlangıç, bitiş, adım sayısı)

  • Başlangıç değeri belirtilmezse varsayılan değer 0 kabul edilir.
  • Bitiş değeri belirtilmezse dizinin uzunluğu varsayılan bitiş değeri kabul edilir.
  • Basamak değeri belirtilmezse varsayılan değer 1 kabul edilir.
import numpy as npnd_array = np.arange(0, 10, 2)
print(nd_array)
Output:
[0 2 4 6 8]

Dizi Elemanlarına Erişim
-
NumPy dizi elemanlarına indexler üzerinden erişiriz.

import numpy as npnd_array = np.array([1,2,3,4,5,7])
print(nd_array[3])
Output:
4
  • 2 boyutlu olan bir dizide elemanlara erişelim
import numpy as npnd_array = np.array([[1,2,3,4,5,7], [2,3,4,5,6,7]])
print(nd_array[1, 3])
Output:
5

Listelerdeki gibi burada da negatif indexleme yapabiliriz.

print(nd_array[1, -1])Output:
7
  • 3 boyutlu olan bir dizide elemanlara erişelim

3 boyutlu dizilerde elemanlara erişmek için, elemanın boyutlarını ve dizinini temsil eden virgülle ayrılmış tamsayılar kullanabiliriz.

import numpy as npnd = np.array([[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]])print(nd[0, 1, 2])Output:
6

NumPy Slicing
NumPy’da slicing, belirli bir indeksten belirli bir indekse kadar olan elemanları almak için kullanılır.

[başlangıç, bitiş, adım sayısı]

  • Başlangıç değeri belirtilmezse varsayılan değer 0 kabul edilir.
  • Bitiş değeri belirtilmezse dizinin uzunluğu varsayılan bitiş değeri kabul edilir.
  • Basamak değeri belirtilmezse varsayılan değer 1 kabul edilir.
import numpy as npnd_1d = np.array([1,2,3,4,5,7])
print(nd_1d[:4])
Output:
[1 2 3 4]
nd_2d = np.array([[3,4,5,7], [2,5,6,7], [6,7,4,3]])
print(nd_2d[0:2, 1:4])
Output:
[[4 5 7]
[5 6 7]]

Dizilerde Veri Tipi
dtype
ile dizinin veri türünü öğreniriz.

import numpy as npnd = np.array([1,2,3,4,5,7])print(nd.dtype)Output:
int32

İstediğimiz boyutu eklemek için ndmin kullanıyorduk. Burada da istediğimiz veri tipini dizi elemanlarını oluştururken verebiliriz.

Yeni bir NumPy dizisi oluşturulduğunda, en uygun veri tipi NumPy tarafından seçilir. Ancak istenirse belirli bir veri tipi seçeneği verilebilir.

import numpy as npnd_array = np.array([1.2, 2.3, 3.3], dtype="i")print(nd_1d)
print(nd_1d.dtype)
Output:
[1 2 3]
int32

np.zeros()
Bu fonksiyon belirtilen satır ve sütuna sahip 0'lardan oluşan bir matris döndürür.

print(np.zeros(2, 3))Output:
[[0. 0. 0.]
[0. 0. 0.]]

np.ones()
zeros() fonksiyonuna benzer şekilde verilen büyüklükte 1'lerden oluşan bir matris döndürür.

print(np.ones(2, 3))Output:
[[1. 1. 1.]
[1. 1. 1.]]

np.eye()
Belirlenen boyutlarda birim matris oluşturmamızı sağlar.

print(np.eye(3, 3))Output:
[[1. 0. 0.]
[0. 1. 0.]
[0. 0. 1.]]

np.random()
İstenilen boyutta bir dizin oluşturur ve bu dizini 0 ve 1 aralığında üretilmiş rastgele ondalık sayılar ile doldurur.

import numpy as npnd = np.random.random((3, 2))
print(nd)
Output:
[[0.35147908 0.12991608]
[0.65023682 0.39693042]
[0.36568784 0.28797874]]

linspace()
İki değer arasında eşit oranlı olacak şekilde değerler oluşturmak için kullanılır.

import numpy as npnd = np.linspace(5, 6, num=5)
print(nd)
Output:
[5. 5.25 5.5 5.75 6. ]

Bu şekilde eşit aralıklarla istediğimiz iki sayı arasında istediğimiz sayıda elemandan oluşan bir dizi oluşturmuş olduk. Burada ardışık elemanlar arasındaki fark hepsinde aynıdır 0.25 oranında artmaktadır.

Burada num kullanmadan da yazabiliriz.

import numpy as npnd = np.linspace(5, 6, 5)
print(nd)
Output:
[5. 5.25 5.5 5.75 6. ]

Burada belirlenen iki sayı arasında eşit aralıklarla elemanları oluştururken fark ettiğiniz gibi bitiş değerini de dahildir. Eğer dahil edilmesini istemiyorsak endpoint=False ekleyerek dahil etmeyebiliriz.

import numpy as npnd = np.linspace(5, 6, 5, endpoint=False)
print(nd)
Output:
[5. 5.2 5.4 5.6 5.8]

full()
Oluşturulacak dizinin elemanlarını aynı eleman ile doldurmak istediğimizde kullanırız. İlk parametrede kaça kaç olacağı ikinci parametrede de hangi değerle dolduracağımız bilgisini veririz.

import numpy as npnd = np.full((2, 3), 7)
print(nd)
Output:
[[7 7 7]
[7 7 7]]

all()
Tüm elemanların verilen şartı sağlayıp sağlamadığını kontrol etmek için kullanılır.

import numpy as npnd = np.array([1,2,3])
np.all(nd < -1)
Output:
False

any()
Herhangi bir eleman verilen şartı sağlıyor mu diye kontrol etmek için kullanılır.

import numpy as npnd = np.array([1,-2,3])
np.any(nd < -1)
Output:
True

Matrisleri birleştirmek
İki numpy array nesnesini concatenate metodu ile birleştiririz.

import numpy as npnd1 = np.array([1,2,3])
nd2 = np.array([4,5,6])
nd3 = np.concatenate([nd1, nd2])
print(nd3)
Output:
[1 2 3 4 5 6]

İki numpy array nesnesini birleştirdiğimiz gibi bir liste ile de birleştirebiliriz. Ayrıca ikiden fazla değeri de birleştirebiliriz.

import numpy as npnd1 = np.array([1,2,3])
nd2 = np.array([4,5,6])
liste = [1,2,3,4,5]
nd3 = np.concatenate([nd1, nd2, liste])
print(nd3)
Output:
[1 2 3 4 5 6 1 2 3 4 5]

Integer değerlerden oluşan bir numpy arrayine içinde string ya da float olan bir liste ile birleştirirsek yeni oluşan numpy array o veri tipinde olacaktır.

import numpy as npnd1 = np.array([1, 2, 3])
liste = [5, 6, 4.5]
nd2 = np.concatenate([nd1, liste])print(nd2)
print(nd2.dtype)
Output:
[1. 2. 3. 5. 6. 4.5]
float64

Satır sütun bazında birleştirme

import numpy as npnd1 = np.arange(0, 10)
nd1 = nd1.reshape(2, 5)
#Satır bazlı birleştirme
print(np.concatenate([nd1, nd1]))
Output:
[[0 1 2 3 4]
[5 6 7 8 9]
[0 1 2 3 4]
[5 6 7 8 9]]
#Sütun bazlı birleştirme
print(np.concatenate([nd1, nd1], axis = 1))
Output:
[[0 1 2 3 4 0 1 2 3 4]
[5 6 7 8 9 5 6 7 8 9]]

axis eklenmediği durumlarda default 0 kabul edilir ve satır bazlı birleştirme işlemi yapılır. axis = 1 sütun bazlı birleştirme işlemi yapar.

NumPy ile Matematiksel İşlemler
*
sum
* max
* min
* mean
* median
* varyans
* standart sapma

import numpy as npnumpy_array = np.array([0,1, 2, 3, 4, 5, 6, 7, 8, 9])
numpy_array = numpy_array.reshape(5,2)
  • sum
print(numpy_array.sum())#satır bazlı toplama
print(“Satır bazlı toplama: “, numpy_array.sum(axis = 1))
#Sütun bazlı toplama
print(“Sütun bazlı toplama: “, numpy_array.sum(axis = 0))
Output:
45
Satır bazlı toplama: [ 1 5 9 13 17]
Sütun bazlı toplama: [20 25]
  • max
print(numpy_array.max())Output:
9
  • min
print(numpy_array.min())Output:
0
  • mean
    Dizinin ortalama değeridir.
print(numpy_array.mean())Output:
4.5
  • median
    Bir dizinin median’ı o diziyi sıraladığımızda tam ortasına denk gelen elemana denir.
  • standart sapma
    Veri değerlerinin ortalamadan ne kadar uzak olduğunun ölçüsüdür. Standart sapma bize dağılımın yaygınlığı hakkında bilgi verir. Normal şartlarda standart sapmayı bulmak için sayıların aritmetik ortalaması bulunur. Her bir sayı aritmetik ortalamadan çıkarılır ve sonucun karesi alınır. Bu kareler toplanır ve toplam serinin eleman sayısının 1 eksiğine bölünür. Bu sonucun karekökü alınır. Standart sapmayı bulmak için bu işlemleri yapmamız gerekir fakat NumPy kütüphanesi np.std() fonksiyonuyla arka planda bu işlemleri yapar ve sonucu bize getirir.
print(numpy_array.std())Output:
2.8722813232690143
  • varyans
    Standart sapmanın karesidir.
print(numpy_array.var())Output:
8.25

Varyans ve standart sapma veri setinde ortalama üzerinden karar veremeyeceğimiz durumlarda bize yardımcı olur.

Aritmetik işlemler

Aritmetik işlemleri yaparken unutulmaması gereken nokta işlem yapılacak matrislerin satır ve sütun sayılarının eşit olması gerekiyor.

import numpy as npnd1 = np.array([[1, 2], [3, 4]])
nd2 = np.array([[5, 6], [7, 8]])
#Toplama
print(nd1 + nd2) #np.add(nd1, nd2) aynı işlevde
Output:
[[ 6 8]
[10 12]]
#Çıkarma
print(nd2 - nd1) #np.subtract(nd2, nd1) aynı işlevde
Output:
[[4 4]
[4 4]]
#Çarpma
print(nd2 * nd1) #np.multiply(nd2, nd1) aynı işlevde
Output:
[[ 5 12]
[21 32]]
#Bölme
print(nd2 / nd1) #np.divide(nd2, nd1) aynı işlevde
Output:
[[5. 3. ]
[2.33333333 2. ]]

İki matrisle işlem yaptığımız gibi matris elemanları üzerinde de istediğimiz sayı ile işlem yapabiliriz.

print(nd2 + 2) #Tüm elemanlara 2 ekledi

NumPy toplama, çıkarma gibi basit dört işlemin yanısıra trigonometrik, logaritmik, üstel fonksiyonlar.. gibi daha kompleks fonksiyonlarla da çalışma imkanı sağlar.

Matrislerin Çarpımı
Matris çarpımı için dot fonksiyonunu kullanırız. İki matris çarpılırken ilk matrisin sütun sayısının ikinci matrisin satır sayısına eşit olması gerekiyor.

import numpy as npnd = np.array([0,1, 2, 3, 4, 5, 6, 7, 8, 9])
nd1 = nd.reshape(5,2)
nd2 = nd.reshape(2,5)
print(np.dot(nd1, nd2))Output:
[[ 5 6 7 8 9]
[ 15 20 25 30 35]
[ 25 34 43 52 61]
[ 35 48 61 74 87]
[ 45 62 79 96 113]]

Matrisin Transpozu
Matrisin satırlarını sütun, sütunlarını satır yapma işlemi numpy ile “ .T” yazmak kadar kolay.

import numpy as npnd = np.array([0,1, 2, 3, 4, 5, 6, 7, 8, 9])
nd = nd.reshape(5,2)
print(nd)
print(nd.T)
Output:
[[0 1]
[2 3]
[4 5]
[6 7]
[8 9]]
[[0 2 4 6 8]
[1 3 5 7 9]]

Kopyalama
Bir diziyi başka bir diziye kopyalamak için copy metodunu kullanıyoruz.

import numpy as npnd = np.array([1,2,4,5,6,7])print("Orijinal Dizi\n ", nd)
nd2 = nd.copy()
print("Kopyalanmış Dizi\n ", nd2)
Output:
Orijinal Dizi
[1 2 4 5 6 7]
Kopyalanmış Dizi
[1 2 4 5 6 7]

Evet arkadaşlar veri bilimi için temel python kütüphanelerinden olan NumPy kütüphanesini bu şekilde ele almış olduk. Umarım hepiniz için faydalı olmuştur. Bir sonraki kütüphanemiz olan Pandas kütüphanesinin anlatımıyla devam ediyor olacağız serimize. Bir sonraki yazımızda görüşmek dileğiyle :)

Hesaplar: Twitter, LinkedIn

--

--