6.2. ndarray¶
ndarray, numpy içindeki sayısal verileri tutan türdür. Tek bir şeyde iki şeydir: tek bir paketlenmiş veri bloğu ve bu bloğun önünde, onun nasıl okunacağını söyleyen küçük bir tanımlayıcı.
6.2.1. Kutunun içi¶
Veri bloğu, dizinin her elemanını uç uca tutar, aralarında fazladan hiçbir şey olmadan. Her eleman aynı sayıda bayt kaplar – uint8 değerleri dizisi için bir, uint16 için iki, float için dört. 256 elemanlı bir uint8 dizisi tam olarak 256 bayt veridir; aynı 256 sayı bir Python list içinde bir kilobayt tutar – değerin gerçekte ne kadar az bite ihtiyacı olursa olsun, eleman başına bir 32 bitlik yuva.
Tanımlayıcı, bloğun ne anlama geldiğini kaydeder. Kaç boyut olursa olsun, herhangi bir dikdörtgen diziyi tanımlamaya beş değer yeter:
dtype– eleman türü. Her elemanın kaç bayt aldığına ve hangi değer aralığını tutabileceğine karar verir (Dtype’lar sayfasında ele alınmıştır).itemsize– dtype’tan türetilen, bir elemanın bayt genişliği.ndim– boyut sayısı (bir vektör için 1, bir matris için 2, bir hacim için 3, en fazla 4).shape– her boyut boyunca boyut, bir demet olarak.strides– her ekseni dolaşmak için veri bloğunda nasıl ilerleneceği. Şekil ve adımlar sayfasında ele alınmıştır.
Hepsi bu. numpy içindeki her hızlı yol – aritmetik, indirgemeler, yayım, dilimleme – eleman başına Python ek yükü olmadan, doğrudan bu beş değer artı veri işaretçisinden çalışır.
6.2.2. Tasarımın sağladıkları¶
“Paketlenmiş blok + küçük tanımlayıcı” yapısından üç özellik doğar ve bölümün geri kalanının nasıl davrandığını tanımlar.
Eleman bazlı matematik tek bir çağrı olarak çalışır. Şekilleri eşleşen iki dizi arasındaki a + b, iki arabelleği toplar ve bir üçüncüsünü yazar, hepsi tek bir kütüphane çağrısı içinde. np.sin(a) her elemanın sinüsü için aynısını yapar. Aritmetik, karşılaştırma ve bit bazlı operatörlerin hepsi bu şekilde çalışır.
Aynı veriye farklı bir biçimde bakmak bedavadır. Bir dizinin bir alt bölgesini ya da aynı verinin farklı bir şekil altında düzenlenmiş halini istemek hiçbir baytı taşımaz. İşlem, aynı veri bloğunu işaret eden yeni bir tanımlayıcı döndürür. Sonuca görünüm (view) denir – aynı temel arabelleğe açılan ikinci bir pencere. Bir görünüm üzerinden yazmak kaynağa yazar.
Karışık şekiller yine de çalışır. Uzun bir diziye karşı daha kısa bir dizi, bir matrise karşı bir satır, bir satıra karşı bir sütun – numpy bunları yayım (broadcasting) yoluyla hizalar; bu, hangi kısa eksenin uzun olanla eşleşmek için esneyeceğine karar veren küçük bir kurallar kümesidir. Esneme sanaldır; hiçbir veri çoğaltılmaz.
6.2.3. Tasarımın maliyetleri¶
Aynı tasarımdan iki kısıtlama doğar.
Her elemanın türü aynıdır. Bir liste, bir int‘in yanında bir str, onun yanında üç int değeri daha içeren bir liste tutabilir; bir ndarray bunu yapamaz. Dtype, oluşturma zamanında sabitlenir. Dtype’lar sayfası, numpy‘nin desteklediği küçük tür kümesini ve birini sabitlemekten doğan kuralları ele alır.
Bir diziyi büyütmek bedava değildir. Bir liste sonunda boş yuvalar tutar ve .append‘i ucuza destekler. Bir ndarray tam olarak ihtiyaç duyduğu boyuttadır; ekleme yapmak, yeni ve daha büyük bir arabellek ayırmak ve eski içeriği içine kopyalamak anlamına gelir. Bilerek hiçbir append() yöntemi yoktur. Kameradaki doğru kalıp, hedefi nihai boyutunda önceden ayırmak ve doldurmaktır; Performans bu tekniği ele alır.
Veri için paketlenmiş türlü bir arabellek, üst veri için küçük bir tanımlayıcı ve üç davranışsal garanti (hızlı eleman bazlı matematik, aynı verinin kopyasız alternatif görünümleri ve yayılan şekiller) ile ndarray, bölümün geri kalanının üzerinde durduğu temeldir. Bir dizinin gerçekte nasıl var olduğu – bir değişmezden, önceden doldurulmuş bir ayırmadan, bir çevre birimi arabelleğinden – bir sonraki pratik sorudur.