NumPy’da Copy, View, Shape, Reshape – Bölüm 8

NumPy’da Copy, View, Shape, Reshape konularını içeren eğitim

NumPy’da copy ve view işlevleri arasındaki farkı bilmeniz gerçekten önemlidir. Aksi durumda dizileri yanlışlıkla değiştirmek ve sonunda orijinal dizideki verilere ulaşamamak gibi sorunlarla karşılaşabilirsiniz. Bir diziyi kopyalama (Copy) ile bir dizinin görünümü (View) arasındaki temel fark, kopyanın yeni bir dizi olması, görünümün ise yalnızca orijinal dizinin bir görünümü olmasıdır.

Kopya dizi içerisinde orijinal diziden gelen veriler vardır ve kopya dizi üzerinde yapılan değişiklikler orijinal diziyi etkilemez. Aynı şekilde orijinal dizide yapılan değişiklikler kopya diziyi etkilemez.

Diğer yandan bir dizi görünümünden söz ediyorsak bu dizide veriler yoktur ve dizi görünümünde yapılan değişiklikler orijinal diziyi etkiler. Benzer şekilde orijinal dizide yapılan değişiklikler görünümü etkiler.

Aslında view ile orijinal (temel) diziyi görüntülüyormuşsunuz gibi düşünün. Ya da aynı veriyi paylaşan iki nesne varmış gibi düşünün ancak ortada farklı iki nesne yoktur. View, orijinal dizinin bir parçası olmasına rağmen kişiye başka bir nesneyle çalışıyormuş hissi verir. (shallow copy)

Diğer yandan Copy ile orijinal diziden ayrı nesne oluşturulur, ancak her iki nesne kopyalandıktan hemen sonra aynı görünür. (deep copy)

Şimdi bir dizinin kopyasını oluşturalım, en baştaki orijinal diziyi değiştirelim ve her iki diziyi de yazdıralım. Bakalım ne olacak!

Kopya dizi, orijinal dizide yapılan değişikliklerden ETKİLENMEMEKTEDİR.

Şimdi bir dizinin görünümünü oluşturalım, yukarıdaki değişikliği aynen yapalım. Bakalım ne olacak!

Görüldüğü gibi görünüm dizi, orijinal dizide yapılan değişikliklerden ETKİLENMEKTEDİR. Peki, görünüm dizide yapılan bir değişiklik orijinal diziyi etkiler mi? Bakalım!

Orijinal dizi, görünümde yapılan değişikliklerden etkilenmektedir.

Dizi veriye sahip mi değil mi?

Daha önce belirttiğim gibi kopya diziler verilerin sahibidir ama görünüm diziler verilerin sahibi değildir, peki bunu nasıl kontrol edebiliriz?

Bir dizinin kendi verisine sahip olup olmadığını kontrol etmek için base niteliği kullanılır. Diğer bir ifade ile bir NumPy dizisinin kendine ait verisi varsa base niteliği None döndürür, dizinin kendine ait verisi yoksa base niteliği orijinal nesneyi gösterir.

Yukarıdaki örnekte görüldüğü gibi Copy ile oluşturulan adana dizisi base ile None değeri döndürdü. View ise oluşturulan bursa dizisi base ile orijinal diziyi döndürdü. Bunun anlamı adana dizisinin kendine ait verisi vardır, bursa dizisinin kendine ait verisi yoktur.

Özetle görünümler ve kopyalar arasındaki temel farklar şunlardır:

  1. Diziyi değiştirme: Bir görünümü değiştirmek orijinal diziyi değiştirirken, bir kopyayı değiştirmek orijinal diziyi değiştirmez.
  2. Geçen süre: Kopyalama işlemi genellikle 1,5-2 kat daha uzun sürer.
  3. Dizinin tabanı (base): Bir görünüm, orijinal diziyle aynı tabana sahiptir. Onun bir kopyasını almaz.
  4. Bellek kullanımı: Bir görünüm orijinal diziyle aynı bellek adresinde (id) yer alırken, bir kopya orijinal dizi ile aynı bellek adresinde yer almaz.

Copy ile View arasındaki fark neden bu kadar önemli?

Öncelikle bir kopyaya ihtiyacınız olduğunda oluşturmazsanız sorunlarınız olacaktır.

Pazartesiden cumaya bir dizi kapanış fiyatımızın olduğu farklı stok kalemlerimiz olduğunu varsayalım, ancak buradaki bazı değerlerin yanlış olabileceğini düşünüyoruz. Her satırın bir hisse senedi fiyatları içerdiğini ve her sütunun günlük verilere karşılık geldiğini varsayalım. Orijinal verilerin bir kopyasını tutarken Stock 0 fiyatlarında düzeltmeler yapmak istiyoruz (örneğin, ikisi arasında tahminlerdeki farklılıkları karşılaştırmak veya sadece bir kopyasını saklamak için).

Genel olarak verilerin bir kopyasını düzenlemek istediğinizde, orijinali değil, np.copy () kullanırız. Bu bir kopya oluşturmamızı sağlamanın en güvenli yoludur. Aksi durumda görünüm daha iyi olur ve ayrıca zamandan ve bellekten tasarruf sağlar.

Daha önce de söylediğim gibi kopyalama 1.5x-2x daha yavaştır ve daha fazla bellek kullanır. Ancak bu genellikle bir sorun edilen bir durum değildir. Sonuçta np.copy () yöntemi kopya oluşturmanın tek yolu değil. Genellikle kopyalar dolaylı olarak yapılır, örneğin; X + = 2 * Y yaptığınızda aslında  2 * Y ve X + 2 * Y diye iki kopya oluşturmuş oluruz.

Diğer yandan zamandan ve bellekten kazanacağız diye mümkün olduğunca görünümleri kullanmamız gerektiği gibi bir anlam çıkarmak doğru değil – performans ile kodun ne kadar okunabilir olduğu arasında bir denge vardır. Günlük basit verilerde veya durumlarda, bu kadar çok optimizasyon düşünmek ya da yapmak gerekmez.

Numpy Dizilerde Shape

Bir dizinin şekli (shape), dizinin her boyutundaki (dimension, örneğin 1D, 2D gibi) elemanların sayısıdır.

NumPy dizilerinde, her indekse karşılık gelen elemanların sayısına sahip bir tuple döndüren ve shape adı verilen bir öznitelik bulunur.

Yukarıdaki örnekte (2, 5) değeri döndü. Bunun anlamı dizi 2 boyutlu ve her boyutta 5 elamanı var.

1, 2, 3, 4 değerli bir vektör ve ndmin kullanarak 3 boyutlu bir dizi oluşturalım ve son boyutun 4 değere sahip olduğunu doğrulayalım:

Yukarıdaki örnekte (1, 1, 4) değeri döndü. Buna shape tuple (şekil demeti) deniyor. Bunun anlamı her indeksteki tamsayılar, ona karşılık gelen boyutun sahip olduğu öğe sayısını gösterir. Örnekte 2. indekste 4 değerine sahibiz, bu nedenle 3. boyutun 4 elemanı olduğunu söyleyebiliriz.

Numpy Dizilerde Reshape

Reshape (yeniden şekillendirme), bir dizinin şeklini (shape) değiştirmek anlamına gelir. Bir dizinin şekli, dizinin her boyutundaki elemanların sayısı anlamına gelmektedir. Reshape demek, diziye yeni boyut eklemek veya mevcut boyutları kaldırmak ya da her boyuttaki eleman sayısını değiştirmek demektir.

Örneğin 12 elemanlı 1-D (1-Dimension) bir diziyi 2-D diziye dönüştürelim. Ortaya çıkan yeni dizide her birinde 3 eleman bulunan 4 dizi bulunsun.

Yukarıdaki örnekteki 12 elemanlı 1-D diziyi 3-D diziye dönüştürelim. Ortaya çıkan yeni dizide her birinde 2 eleman olan 3 diziden oluşan 2 dizi bulunsun. Beyninizde yanmalar hissetmeye başladınız mı? Lütfen sakin olun ve devam edin.

Aşağıdaki şekilleri inceleyerek yukarıdaki örnekteki 3-D dizinin yeni şeklini tahmin edebilir misiniz?

Bunu bildiğim iyi oldu! 3-D diziler (x, y, z) şeklinde ifade edilmektedir. Burada x yükseklik, y genişlik, z ise derinlik anlamına gelmektedir. Daha fazlası bilgi için lütfen tıklayınız.

Reshape işleminde dikkat edilmesi gereken bir konu; reshape için gerekli elemanlar her iki şekilde de eşit olmalıdır. Örneğin; 8 elemanlı 1D dizisini 2 satırda 4 eleman olacak şekilde 2D bir dizide yeniden şekillendirebiliriz, ancak 3×3 = 9 eleman gerektireceği için 3 satırda 3 eleman yer alacak şekilde 2-D dizide yeniden şekillendiremeyiz.

Reshape ile oluşturulan yeni dizi copy dizi mi olur view dizi gibi mi davranır? Bu sorunun cevabı; Aşağıdaki örnekte ispatlandığı gibi reshape orijinal diziyi döndürür, dolayısıyla yeni dizi bir görünümdür.

Bilinmeyen Boyut

Bir “bilinmeyen” boyutunuz olabilir. Bu ne demek; Reshape yöntemindeki boyutlardan biri için tam bir sayı belirtmeniz gerekmediği anlamına gelir. Değer olarak -1 değerini verin ve NumPy bu sayıyı sizin için hesaplasın. Ancak burada dikkat edilmesi gereken -1’i birden fazla boyuta geçiremeyiz, sadece bir boyutta kullanabiliriz.

8 elemanlı 1D dizisini 2×2 elemanlı 3D diziye dönüştürelim:

Şimdi sıra sizde! Yukarıdaki örnekte bilinmeyen boyutun değerini tahmin ediniz.

Flattening

Flattening (düzleştirme), çok boyutlu bir diziyi 1D dizisine dönüştürmek anlamına gelir. Bunu yapmak için reshape (-1) kullanabiliriz.

Numpy’da dizilerin şekillerini değiştirmek için flatten, ravel gibi işlevlerin yanı sıra dizi elemanlarını yeniden düzenlemek için rot90, flip, fliplr, flipud gibi işlevler bulunmaktadır.

Serinin Github kaynakları için tıklayınız.

Bir önceki bölüm: NumPy Veri Tipleri ve NumPy’da Array Oluşturma – Bölüm 7

Bir sonraki bölüm: NumPy’da İterasyon, Join, Split, Search, Sort, Filter – Bölüm 9

Kaynaklar:

[1] https://www.jessicayung.com/numpy-views-vs-copies-avoiding-costly-mistakes/

[2] https://www.w3schools.com/python

2 thoughts on

NumPy’da Copy, View, Shape, Reshape – Bölüm 8

Bir cevap yazın

Data Science Earth

Data Science Earth ekibi, üst düzey Veri Bilim çözümleri üretmek amacı ile toplanmış akademisyenler ve uzmanlardan oluşmaktadır. Öncelikli olarak veri bilincini geliştirmeyi ve küreselleşen rekabet ortamında verinin gücünün doğru kullanılmasını sağlamayı amaçlamaktadır.

Sponsor

QuestionPro 35 farklı soru seçim özelliği ile anket çalışmalarımıza güç katmaktadır.