6.3. Dizi oluşturma

Bu sayfaların geri kalanındaki her örnek, elinizde zaten bir ndarray bulunduğunu varsayar. Bu sayfa, o dizinin nasıl meydana geldiğinin kataloğudur. Dört yapıcı ailesi vardır:

  • Bir Python yinelenebilirinden – olağan değişmez / liste / demet biçimi.

  • Belirli bir şekilde önceden doldurulmuş – sıfırlar, birler, sabit bir değer, bir birim matris.

  • Bir dizi olarak üretilmiş – aralıklı veya eşit aralıklı değerler.

  • RAM’de zaten bulunan bir arabelleği sarmalama – çevre birimi durumu.

Her yapıcı bir dtype= anahtar sözcüğü alır ve varsayılan olarak float kullanır. Sensör verileri neredeyse her zaman varsayılandan daha küçük bir dtype ister.

Aşağıdaki her örnek şununla başlar:

from ulab import numpy as np

6.3.1. Bir Python yinelenebilirinden

array(), herhangi bir sayı yinelenebilirinden bir ndarray oluşturur:

a = np.array([1, 2, 3, 4])
print(a)

Çıktı:

array([1.0, 2.0, 3.0, 4.0], dtype=float)

İç içe yinelenebilirler çok boyutlu diziler üretir. İç yinelenebilirlerin hepsi aynı uzunlukta olmalıdır, aksi takdirde ValueError ortaya çıkar:

m = np.array([[1, 2, 3],
              [4, 5, 6]], dtype=np.uint8)

Önceden var olan bir ndarray de geçerli bir girdidir; array() her zaman kopyalar. Gerekmediğinde kopyadan kaçınmak için asarray() kullanın:

b = np.asarray(a, dtype=np.float)   # same dtype -> no copy

6.3.2. Belirli bir şekilde önceden doldurulmuş

Hedef şekil biliniyor ancak içerik henüz bilinmiyorsa, arabelleği önceden ayırın ve daha sonra içine yazın:

  • zeros() – sıfırlarla doldurulur.

  • ones() – birlerle doldurulur.

  • full() – verilen bir değerle doldurulur.

  • empty()zeros() için takma ad (ulab, arabelleği başlatılmamış halde bırakmaz).

  • eye()k‘ıncı köşegeninde birler bulunan, birim matrise benzer N-çarpı-M matris.

  • diag() – bir vektörden köşegen matris veya bir matrisin köşegeni.

np.zeros((3, 3))                   # 3x3 of zeros
np.ones(5, dtype=np.uint8)         # length-5 vector of ones
np.full((2, 3), 7, dtype=np.int8)  # 2x3, all 7
np.eye(4)                          # 4x4 identity
np.diag([1, 2, 3])                 # 3x3, [1, 2, 3] on the diagonal

shape argümanı ya tek bir tamsayı (1 boyutlu dizi için) ya da bir demettir.

6.3.3. Bir dizi olarak üretilmiş

  • arange() – yerleşik range() gibi eşit aralıklı değerler, ancak her zaman bir ndarray döndürür:

    np.arange(0, 10, 2)            # array([0, 2, 4, 6, 8])
    
  • linspace() – iki sınır arasında num adet eşit aralıklı nokta; endpoint=True olduğunda üst sınır dahil edilir:

    np.linspace(0, 1, num=11)      # 0.0, 0.1, ..., 1.0
    
  • logspace() – geometrik olarak aralıklı noktalar. start ve stop uç noktalar değil, üs değerleridir; sonuç base ** start‘tan base ** stop‘a kadar uzanır:

    np.logspace(0, 3, num=4)       # 1.0, 10.0, 100.0, 1000.0
    
  • meshgrid() – iki 1 boyutlu diziden iki koordinat matrisi oluşturur; böylece piksel başına bir fonksiyon f(x, y), tek bir vektörleştirilmiş çağrıda tüm bir ızgara üzerinde değerlendirilebilir. W uzunluğunda bir x-vektörü ve H uzunluğunda bir y-vektörü verildiğinde, meshgrid iki H-çarpı-W matris döndürür: X, her satır boyunca tekrarlanan x-vektörüdür, Y ise her sütun boyunca tekrarlanan y-vektörüdür; böylece X[i, j] x-koordinatı, Y[i, j] ise satır i ve sütun j‘deki hücrenin y-koordinatı olur:

    x = np.arange(4)            # [0, 1, 2, 3]
    y = np.arange(3)            # [0, 1, 2]
    X, Y = np.meshgrid(x, y)
    # X = [[0, 1, 2, 3],
    #      [0, 1, 2, 3],
    #      [0, 1, 2, 3]]
    # Y = [[0, 0, 0, 0],
    #      [1, 1, 1, 1],
    #      [2, 2, 2, 2]]
    

    f(X, Y) daha sonra fonksiyonu ızgaranın her hücresinde tek bir ifadeyle değerlendirir. Örneğin, bir (H, W) çerçevesi üzerindeki merkeze uzaklık haritası, meshgrid() tarafından döndürülen matrislere karşı np.sqrt((X - cx)**2 + (Y - cy)**2) ifadesidir.

6.3.4. Birleştirme

concatenate(), mevcut bir eksen boyunca bir dizi demetini birleştirir:

a = np.array([[1, 2], [3, 4]], dtype=np.uint8)
b = np.array([[5, 6]],         dtype=np.uint8)
np.concatenate((a, b), axis=0)
# array([[1, 2], [3, 4], [5, 6]], dtype=uint8)

Tüm girdiler aynı dtype ve ndim değerini paylaşmalı ve birleştirilen eksen dışındaki her eksende eşleşmelidir. concatenate(), her girdiyi tutacak kadar büyük taze bir dizi ayırır ve verileri içine kopyalar; dolayısıyla zaten var olan dizilerin tek seferlik birleştirilmesi için doğru araçtır; bir akış döngüsü içinde ise yanlış araçtır, orada hedefi bir kez önceden ayırıp dilim atamasıyla içine yazmak doğru kalıptır.

6.3.5. Mevcut bir arabelleği sarmalama

Bir kameradaki en kullanışlı yapıcı frombuffer()‘dır. Mevcut bayt benzeri bir arabelleği, tek bir baytı bile kopyalamadan 1 boyutlu bir ndarray olarak yeniden yorumlar:

buf = bytearray(8)
audio = np.frombuffer(buf, dtype=np.int16)
# 4 int16 samples, sharing memory with buf

audio üzerinden yapılan yazmalar buf‘ta görünür ve tersi de geçerlidir. Seçilen dtype, arabellek uzunluğunu tam olarak bölmelidir.

offset= arabelleğin başındaki bir başlığı atlar; count= ise kaç eleman okunacağını sınırlar:

np.frombuffer(buf, dtype=np.uint8, offset=2, count=4)

Bir çevre birimi uygulamaya ham bir arabellek verdiğinde – bir bytearray içindeki ADC örnekleri, SPI‘dan çekilen bir yük – bu doğru yapıcıdır. Çevre biriminin yazdığı baytlar dizinin ta kendisidir.

Bir çevre birimi, kameranın CPU’sunun yerel olarak okumadığı bir bayt sıralamasında çok baytlı değerler yazdığında, byteswap() her elemanın bayt sırasını tersine çevirir, böylece değerler doğru okunur. Varsayılan olarak yeni bir dizi döndürür; inplace=True geçirildiğinde kaynağı yerinde değiştirir.

frombuffer() yalnızca numpy‘nin kendisinin tanımladığı dtype’ları işler. 32 bitlik tamsayı örnekleri üreten çevre birimleri için from_int32_buffer() ve benzerleri tek bir geçişte float‘a dönüştürür.