[TR] Veri Analizi – NumPy

[TR] Veri Analizi - NumPy
[TR] Veri Analizi - NumPy

[TR] Veri Analizi – NumPy

Merhaba; ben Süleyman Kaya, bilgisayar bilimleri ve data science araştırmacısıyım. Bu yazımda NumPy kütüphanesinin ne olduğuna, NumPy dizileri ile çalışma, dizilerin indekslenmesi ve dizi operasyonlarına değindim. Bu yazıyı NumPy kütüphanesini yeni yeni keşfederken “beginner” sıfatıyla sizlerle paylaşıyorum, dolayısıyla benim gibi bu kütüphanenin yabancısı olan ve bir adım atmak isteyen beginner’lar için hoş bir yayın olacak gibi duruyor, sizin için faydalı olup olmayacağını anlamak maksadıyla konu başlıklarını incelemenizi tavsiye ederim, keyifli okumalar.

NumPy Nedir?

NumPy, veri analizinde kullanılan oldukça popüler bir kütüphanedir. Kullanım alanının geniş olmasından ve python listelerinden daha hızlı ve daha büyük verilerle çalışabilmesinden ötürü NumPy kütüphanesini birçok projede görmüş olabilirsiniz. Bu kütüphaneyi “pip install numpy” komudu ile kolayca elde edebilir, “import numpy” ile python projemize dahil edebiliriz.

NumPy Dizileriyle Çalışma

numpy.array() methodunun içine göndereceğimiz bir liste, bize bir NumPy array’i olarak geri döner.

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

Çok boyutlu bir dizi oluşturmak istersek reshape() methodunu kullanarak tek bboyutu bir diziyi çok boyutlu yapıya dönüştürürüz. Örnek olarak yukarıda oluşturduğumuz 9 elemanlı array dizisini 3’e 3’lük bir matrise dönüştürelim:

multi_dimensional_array = array.reshape(3,3) # 3 satır ve 3 sütundan oluşan bir dizi yapısı oluşturduk.

arage() metodunun içine atılan başlangıç, bitiş ve adım değerleri ile ritmik bir şekilde değer artışı/azalmasıyla bir dizi oluşturulabilir.

Örnek:

dizim = numpy.arange(1, 10) # 1’de 10’a kadar rakamların bulunduğu bir dizi oluşturalım, 3. parametre (adım) methoda gönderilmezse ardışık olarak ilerleriz

Çıktısı:

[1 2 3 4 5 6 7 8 9]

Örnek:

cift_rakamlar = numpy.arange(0, 10, 2)

Çıktısı:

[0 2 4 6 8]

zeros(x) metodu, içinde sadece float tipinde 0’ların bulunduğu x elemanlı bir NumPy dizisi oluşturmamızı sağlar.

Örnek:

dizim = numpy.zeros(10)

Çıktısı:

[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]

ones(x) metodu, içinde sadece float tipinde 1’lerin bulunduğu x elemanlı bir NumPy dizisi oluşturmamızı sağlar.

Örnek:

dizim = numpy.ones(10)

Çıktısı:

[1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]

Belli bir aralıkta ve eşit miktarda artışa sahip bir dizi oluşturmak istediğimizde bu methodu kullanırız. Yani başlangıç ve bitiş değerlerini 3 parametre miktarınca böler.

Örnek:

dizim = numpy.linspace(0, 100, 5) # 0 ile 100 arasında 5 eşit artış miktarına sahip verilerin dizisi

Çıktısı:

[0. 25. 50. 75. 100.]

NumPy kütüphanesi içinde random isimli bir class barındırır ve bu class’ın içindeki randint(x, y, z) metodu ile rastgele x minimum, y maksimum olmak üzere x ile y (y hariç) arasında z kadar veya randint(y) (y maksimum değer olmak kaydıyla) rastgele bir sayı üretilebilir.

Örnek:

rastgele_sayim = numpy.random.randint(0, 100)

Çıktısı:

1 #Rastgele üretilmiş bir sayı

Örnek:

rastgele_sayim = numpy.random.randint(0, 100, 10)

Çıktısı:

[1 2 4 8 16 32 64 128 256] #Rastgele üretilmiş sayılar dizisi

random.rand(a) metodu ile 0 ile 1 arasında yalnızca pozitif olmak kaydıyla rastgele a kadar sayı üretebiliriz.

Örnek:

sayim = numpy.random.rand(5)

Çıktısı:

[0.91606556, 0.70194255, 0.29389498, 0.79018207, 0.1190293 ]

random.randn(a) metodu ile 0 ile 1 arasında pozitif veya negatif rastgele a kadar sayı üretebiliriz.

Örnek:

sayim = numpy.random.randn(5)

Çıktısı:

[ 0.99869798 -0.99862 -1.29092941 0.42673477 1.20581078]

reshape() metodu ile tek boyutlu dizileri çok boyutlu dizilere dönüştürebiliriz.

Örnek:

# İçinde 50 tane int veri tipinde değer barındıran bir ndarray’i 5’e 10’luk bir matrise dönüştürelim.

d1_array = numpy.arange(50)

d2_array = d1_array.reshape(5, 10)

print(d2_array)

Çıktısı:

[[ 0 1 2 3 4 5 6 7 8 9]
[10 11 12 13 14 15 16 17 18 19]
[20 21 22 23 24 25 26 27 28 29]
[30 31 32 33 34 35 36 37 38 39]
[40 41 42 43 44 45 46 47 48 49]]

Dizimizin içindeki en büyük değeri döndürür.

Örnek:

print(d2_array.max())

Çıktısı:

49

Dizimizin içindeki en küçük değeri döndürür.

Örnek:

print(d2_array.min())

Çıktısı:

0

Dizimizin içindeki verilen ortalamasını döndürür.

Örnek:

print(d2_array.mean())

Çıktısı:

24.5

Dizimizin içindeki en büyük değerin indeksini döndürür.

Örnek:

print(d1_array.argmax())

Çıktısı:

49

Dizimizin içindeki en büyük değerin indeksini döndürür.

Örnek:

print(d1_array.argmax())

Çıktısı:

0

NumPy Dizilerinin Indekslenmesi

Bir dizi tanımlayalım:

sayilar = numpy.array([0,5,10,15,20,25,50,75])

Dizimizin 5. indeksindeki elemanını yazdıralım:

print(sayilar[5]) # => 25

print(sayilar[-3]) # => 25

0 ile 3 indeks numaraları arasındaki değerleri yazdıralım:

print(sayilar[0:3]) # => [0 5 10]

veya

print(sayilar[:3]) # => [0 5 10]

3. indeksten başlayıp son indeks değerine kadar olan verilerimizi getirelim:

print(sayilar[3:]) # => [15 20 25 50 75]

Bütün dizi elemanlarını yazdırmak istersek ise :: kullanırız:

print(sayilar[::]) # => [0,5,10,15,20,25,50,75]

Dizimizi listedeki step sayısını -1 yaparak tersten yazıdralım:

print(sayilar[::-1]) # => [75, 50, 25, 20, 15, 10, 5, 0]

Step sayısını -2 yapalım:

[75, 25, 15, 5]

Şimdi iki boyutlu 3’e 3’lük bir matris dizi oluşturalım:

numbers = numpy.array([[0,5,10],[15,20,25],[50,75,85]])

İki boyutlu dizimizin ilk elemanını alalım:

print(numbers[0]) # => [0 5 10]

İki boyutlu dizimizin ikinci elemanını alalım:

print(numbers[1]) # => [15,20,25]

İki boyutlu dizimizin üçüncü elemanını alalım:

print(numbers[2]) # => [50,75,85]

Şimdi ise ki boyutlu dizimizin ilk elemanının ilk elemanını alalım:

print(numbers[0,1]) # => [0]

İki boyutlu dizimizin ikinci elemanının birinci elemanını alalım:

print(numbers[1,1]) # => [15]

İki boyutlu dizimizin üçüncü elemanının ikinci elemanını alalım:

print(numbers[2,1]) # => [75]

Bütün satırların içindeki 2 indeksli değeri getirelim:

print(numbers[:, 2]) # => [10 25 85]

Bütün satırların içindeki 1 indeksli değeri getirelim:

print(numbers[:, 1]) # => [5 20 75]

Bütün satırların içindeki 0 indeksli değeri getirelim:

print(numbers[:, 1]) # => [0 15 50]

Bütün satırların 0’dan 2. indekse kadar olan tüm verilerini bir dizide saklayalım:

dizim = numbers[:, :2]; print(dizim)

Çıktısı:

[[ 0 5]
[15 20]
[50 75]]

Bütün satırların 0’dan 3. indekse kadar olan tüm verilerini bir dizide saklayalım:

dizim = numbers[:, :3]; print(dizim)

Çıktısı:

[[ 0 5 10]
[15 20 25]
[50 75 85]]

NumPy Dizi Operasyonları

İki dizinin elemanlarını birbiriyle toplayalım ve yeni bir dizide sonuçları saklayalım:

numbers1 = numpy.random.randint(10, 100, 6)

numbers2 = numpy.random.randint(10, 100, 6)

sum = numbers1 + numbers2; print(sum)

Çıktısı:

[ 83 80 143 56 61 103]

Bir dizinin her elemanını 10 ile toplayalım:

numbers1 = numpy.random.randint(10, 100, 6)

sum = numbers1 + 10; print(sum)

Çıktısı:

[ 50 104 40 69 102 108]

İki dizinin elemanlarının farkını bulalım ve yeni bir dizide sonuçları saklayalım:

numbers1 = numpy.random.randint(10, 100, 6)

numbers2 = numpy.random.randint(10, 100, 6)

sum = numbers1-numbers2; print(sum)

Çıktısı:

[-32 35 34 -72 4 -81]

Bir dizinin her elemanını 10 ile çarpalım:

numbers1 = numpy.random.randint(10, 100, 6)

sum = numbers1*10; print(sum)

Çıktısı:

[110 360 480 590 660 830]

Bir dizinin her elemanının sinüsünü bulalım:

numbers1 = numpy.random.randint(10, 100, 6)

result = numpy.sin(numbers1); print(result)

Çıktısı:

[-0.38778164 -0.89792768 -0.7391807 0.90178835 0.52908269 0.86006941]

Bir dizinin her elemanının kosinüsünü bulalım:

numbers1 = numpy.random.randint(10, 100, 6)

result = numpy.cos(numbers1); print(result)

Çıktısı:

[ 0.90744678 -0.95765948 0.67350716 -0.74805753 -0.18043045 0.96496603]

Bir dizinin her elemanının karekökünü bulalım:

numbers1 = numpy.random.randint(10, 100, 6)

result = numpy.sqrt(numbers1); print(result)

Çıktısı:

[-0.38778164 -0.89792768 -0.7391807 0.90178835 0.52908269 0.86006941]

Bir dizinin her elemanının logaritmasını bulalım:

numbers1 = numpy.random.randint(10, 100, 6)

result = numpy.log(numbers1); print(result)

Çıktısı:

[3.58351894 4.49980967 4.48863637 4.55387689 4.39444915 2.39789527]

mnumbers1 = numbers1.reshape(2,3)

mnumbers2 = numbers2.reshape(2,3)

result = np.vstack((mnumbers1, mnumbers2)) # Dizileri yatay şekilde birleştirir, satırlar halinde

result = np.hstack((mnumbers1, mnumbers2)) # Dizileri dikey şekilde birleştirir, sütunlar halinde

# Dizi elemanlarının belirli bir şarta uyup uymadığını kontrol edelim

result = 50 > mnumbers1

print(result)

Bonus: Uygulama

Kendinizi geliştirmek için aşağıda verilen görevleri tamamlamanızı öneririm. Soruların çözümünü yazdığım python dosyasına ise buradan ulaşabilirsiniz.

Sorular:

# 1- (10,15,30,45,60) değerlerine sahip numpy dizisi oluşturunuz

# 2- (5–15) arasındaki sayılarla numpy dizisi oluşturunuz.

# 3- (50–100) arasında 5’er 5’er artarak numpy dizisi oluşturunuz

# 4- 10 elemanlı sıfırlardan oluşan bir dizi oluşturunuz.

# 5- 10 elemanlı birlerden oluşan bir dizi oluşturunuz.

# 6- (0–100) arasında eşit aralıklı 5 sayı üretin.

# 7- (10–30) arasında rastgee 5 tane tamsayı üretin.

# 8 — [-1 ile 1] arasında 10 adet sayı üretin

# 9- (3×5) boyutlarında (10–50) arasında rastgele bir matris oluşturunuz.

# 10- Üretilen matrisin satır ve sütunlarının toplamlarını hesaplayınız.

# 11- Üretilen matrisin en büyük, en küçük ve ortalama değerleri nelerdir?

# 12- Üretilen matrisin en büyük değerinin indeksi kaçtır?

# 13- (10–20) arasındaki sayıları içeren dizinin ilk 3 elemanını seçiniz.

# 14- Üretilen dizinin elemanlarını tersten yazdırın.

# Şimdi listeyi multi-dimensional yapalım

# 15- Üretilen matrisin ilk satırını seçiniz

# 16- Üretilen matrisin 2. satır 3. sütundaki elemanı hangisidir.

# 17- Üretilen matrisin tüm satırlardaki ilk elemanlarını seçiniz

# 18- Üretilen matrisin her bir elemanının karesini alınız.

# 19- Üretilen matris elemanlarının hangisi pozitif çift sayıdır? (Aralığı -50, +50 arasında yapınız)

Kapanış

Umarım aradığınız pratik bilgiye ulaşmışsınızdır, keyifli çalışmalar.