NumPy’da iterasyon (tekrarlama), dizi elemanlarının tek tek alınması anlamına gelir. Bunu NumPy’da çok boyutlu dizileri ele alırken, Python’daki for döngüsünü kullanarak yapabiliriz ancak bunun tek yolu bu değil.
For döngüsü ile 1-D bir dizi üzerinde döndürme (loop) işlemi, her bir elemanı tek tek görecektir.
2-D bir dizide döngü tüm satırlardan geçecektir.
Herhangi bir n-D dizisi için aynı şekilde işlem görecektir. Ancak dizi içindeki skaler değerleri döndürmek için, her boyuttaki dizilerin iterasyonu gerekir. Örneğin yukarıdaki örnekteki 2-D dizideki her bir scaler değeri döndürmek için;
Şimdi sıra sizde! Aşağıdaki 3-D dizideki scaler değerleri yazdırınız. Cevabınız serinin github kaynaklarında.
dizi = np.array([[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]])
nditer () kullanarak dizilerin iterasyonu
nditer () işlevi, en basitten en gelişmişse kadar tüm iterasyonlarda kullanılabilir. İterasyonlarda karşılaştığımız bazı temel sorunları çözüm getirir. Özellikle çok boyutlu dizilerde bir dizinin her bir skaleri boyunca iterasyon yapmak demek n tane for kullanmak demektir ki bu da yazılması zor olabilecek döngüler kullanmamızı gerektirir. Ancak nditer() ile bu sorun kolayca çözülür.
Bir dizideki her bir elemanı yazdırırken atlayarak gitmek istersek;
Örneğin yukarıdaki örnekte sadece tek sayıları almak istiyoruz:
ndenumerate() kullanarak iterasyon
enumerate, bir şeyin sıra numarasından bahsetmek demektir. Bazen iterasyon sırasında bir elemanın indeksine ihtiyacımız olur, ndenumerate () yöntemi bunun için kullanılabilir.
NumPy Dizilerinde Join
Join, iki veya daha fazla dizinin içeriğinin tek bir dizide birleştirilmesi anlamına gelir. SQL’de tabloları bir anahtara göre birleştiriyoruz, NumPy’da ise dizileri eksenlerle (axis) birleştiriyoruz.
Axis ile birlikte concatenate () işlevine birleştirmek istediğimiz iki diziyi iletiyoruz. Axis açıkça belirtilmezse, varsayılanı 0 kabul edilir.
2-D diziler için aynı işlemi yapalım:
Yukarıdaki örnekte 2-D diziler sütun boyunca birleştirildi. Çünkü axis değeri varsayılan olarak 0 alındı. Şimdi bu iki tane 2-D diziyi satır boyunca (axis=1) birleştirelim:
Stack İşlevlerini Kullanarak Dizileri Birleştirme
Stack aslında concatenation ile aynıdır. Aralarındaki fark, stack işleminde birleştirmenin yeni bir axis boyunca yapılmasıdır. Örneğin ikinci eksen boyunca iki tane 1-D dizisini birleştirebiliriz, bu da onları bir diğerinin üzerine yerleştirir.
Axis ile birlikte stack () işlevine birleştirmek istediğimiz iki diziyi iletiyoruz. Axis açıkça belirtilmezse, varsayılanı 0 kabul edilir.
NumPy’da hstack () satırlar (rows) boyunca birleştirme/yığma yapar.
NumPy’da vstack () sütunlar (columns) boyunca birleştirme/yığma yapar.
NumPy’da dstack () derinlik (depth) boyunca birleştirme/yığma yapar.
NumPy Dizilerini Bölme
Splitting (bölme), birleştirme (join) işleminin tersidir. Join birden çok diziyi birleştirirken splitting bir diziyi birden çok diziye böler.
Dizileri bölmek için array_split () işlevini kullanırız, bu işlemde bölmek istediğimiz diziyi ve bölünme sayısını belirleriz.
Yukarıdaki örnekte bölünecek dizinin eleman sayısı 12 idi ve bu sayı 4’e bölünüyordu. Peki, bu diziyi 5’e bölmek isteseydik ne olurdu? Bakalım.
Görüldüğü gibi dizinin bölünmek için gerektiğinden az elemanı olduğu durumlarda, tüm elemanlar buna uygun şekilde ayarlanacaktır.
Aslında NumPy’da split () işlevi de var ancak bu işlevde bölünme için kaynak dizideki elemanlar daha az olduğunda elemanlar yukarıdaki gibi ayarlamayacak, bu tür durumlarda array_split () düzgün çalışır, ancak split () düzgün çalışmaz, hata verir.
Array_split(), böldüğü her parçayı bir dizi olarak döndürür. Dizi elemanlarını aşağıdaki şekilde yazdırabiliriz.
2-D bir dizide split işlemini inceleyelim. Lütfen aşağıdaki iki örneği inceleyelim ve aralarındaki farka bakalım.
Yukarıdaki ilk örnek 4 tane 2-D dizisi döndürdü. Son iki parçaya birer eleman düştü. İkinci örneğe bakalım, bu sefer 2-D dizilerindeki her parça 2 eleman içeriyor. Peki, 2- D dizi içerisindeki her bir dizinin eleman sayısını arttıralım ve sonucu inceleyelim.
Bölme işlemlerinde arta gelen elemanların sonraki array’lere eşit olarak yerleştirildiğine dikkat edin!
Splitting işleminde ayrıca bölmeyi yapmak istediğimiz ekseni (axis) belirleyebiliriz. Aşağıdaki örnek 3 tane 2-D dizisi döndürüyor, ancak bunlar satır boyunca bölünüyor (axis = 1).
Yukarıdaki örnekte satır boyunca bölme işlemine alternatif olarak hstack() işlevinin tersi hsplit() işlevi de aynı işi görmektedir.
Benzer şekilde sütun boyunca bölme işleminde vstack() işlevinin tersi vsplit() kullanılabilir. Ayrıca derinlik boyunca bölme işleminde dstack() işlevinin tersi dsplit() kullanılabilir. Yalnız dsplit() işlevinin 3 ve daha fazla boyutlu dizilerde kullanıldığını hatırlayalım.
Dizileri Arama
Bir dizide belirli bir değeri arayabilir ve eşleşen indeksleri döndürebilirsiniz. Bir dizide değer aramak için where () işlevini kullanırız.
Yukarıdaki örnekte 10 değerinin bulunduğu indeks numaraları (array([2,6,8],)) şeklinde bir tuple olarak döndü. Bunun anlamı 10 değeri bu dizide 2., 6, ve 8. indekslerde yer alıyor.
Where() işlevi içinde aslında bir koşul belirtildiğine dikkat edelim. Bunun anlamı bu işlev içinde koşullu yapılar kullanılabilir. Örneğin where(dizi%2==0) yazarsak bize dizide bulunan çift sayıların bulunduğu indeksleri verir. Aynı şekilde where(dizi>=5) yazarsak bize dizide bulunan 5 ve 5’ten büyük sayıların indeksini verecektir.
Searchsorted()
Dizilerde binary arama yapan ve arama sırasını korumak için belirtilen değerin ekleneceği dizini döndüren searchsorted() adında bir işlev vardır. Bu işlev sadece sıralı dizilerde kullanılır.
Örneğin aşağıdaki örnekte sıralama düzenini korumak için 6 sayısı 5. indekse eklenmelidir.
Searchsorted() aramayı soldan başlatır ve 6 sayısının bir sonraki değerden daha büyük olmadığı ilk dizini döndürür.
Yukarıdaki dizi örneğin 6 değeri olsaydı searchsorted() ne döndürürdü? Bakalım.
Yine aynı indekse yerleştirildiğini gördük.
Searchsorted() aracılığı ile birden fazla değer aramak için belirtilen değerlere sahip bir dizi kullanılabilir.
Yukarıdaki örnekte dönen değer [2, 2, 3, 4, 5]. Bunlar [3, 4, 6, 8, 10] dizisi içindeki değerlerin orijinal dizide yerleşeceği indeks numaraları. Böylece sıralama doğru şekilde tamamlanmış olacak.
Dizileri Sıralama
Sorting (sıralama), dizi elemanlarını bir sıraya koymak anlamına gelir. Sıralı dizi, sayısal veya alfabetik, artan veya azalan gibi şekillerde yapılır. NumPy ndarray nesnesinin, belirli bir diziyi sıralayacak sort () adında bir işlevi vardır. Yalnız bu işlev copy bir dizi yaratır, orijinal diziyi değiştirmez.
Orijinal dizi 2-D bir dizi ise sıralama işlemi her bir alt dizi içinde yapılır.
Dizileri Filtreleme
Filtering (filtreleme), bir dizi içinden belirli elemanları alıp bunlardan yeni bir dizi oluşturmak anlamına gelmektedir.
NumPy’da bir boolean indeks listesi oluşturarak filtreleme yapılabilir.
Boolean indeks listesi bir dizi içerisindeki indekslere karşılık gelen boolean değerlerdir. Eğer indeks değeri True ise eleman filtrelenen dizide yer alır, eğer indeks değeri False ise eleman filtrelenen dizide yer almaz.
Dikkat! True ve False değerlerini true ve false şeklinde küçük harflerle yazmayın.
Filtreleme işlemi bir koşula bağlı olarak da yapılabilir. Aşağıdaki örneği inceleyelim.
Yukarıdaki örneğe alternatif olarak NumPy’ın güzelliği koşulu doğrudan da belirletebiliriz. Aşağıdaki örneği inceleyelim.
Bu bölümde sizlere NumPy’da iterasyon, dizileri birleştirme, dizileri ayırma, diziler içerisinde arama yapma, dizileri sıralama ve filtreleme işlemlerinden bahsettim. Gelecek bölümde görüşmek dileğiyle,
Serinin Github kaynakları için tıklayınız.
Bir önceki bölüm: NumPy’da Copy, View, Shape, Reshape – Bölüm 8
Bir sonraki bölüm: NumPy’da Random Sayılar, Random Veri Dağılımı ve Seaborn – Bölüm 10
Kaynaklar: www.w3schools.com/python