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 benzerN-çarpı-Mmatris.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şikrange()gibi eşit aralıklı değerler, ancak her zaman birndarraydöndürür:np.arange(0, 10, 2) # array([0, 2, 4, 6, 8])linspace()– iki sınır arasındanumadet eşit aralıklı nokta;endpoint=Trueolduğunda üst sınır dahil edilir:np.linspace(0, 1, num=11) # 0.0, 0.1, ..., 1.0logspace()– geometrik olarak aralıklı noktalar.startvestopuç noktalar değil, üs değerleridir; sonuçbase ** start‘tanbase ** stop‘a kadar uzanır:np.logspace(0, 3, num=4) # 1.0, 10.0, 100.0, 1000.0meshgrid()– iki 1 boyutlu diziden iki koordinat matrisi oluşturur; böylece piksel başına bir fonksiyonf(x, y), tek bir vektörleştirilmiş çağrıda tüm bir ızgara üzerinde değerlendirilebilir.Wuzunluğunda bir x-vektörü veHuzunluğunda bir y-vektörü verildiğinde,meshgridikiH-çarpı-Wmatris döndürür:X, her satır boyunca tekrarlanan x-vektörüdür,Yise her sütun boyunca tekrarlanan y-vektörüdür; böyleceX[i, j]x-koordinatı,Y[i, j]ise satırive sütunj‘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.
6.3.6. Yazdırma kırpması¶
Büyük bir diziyi yazdırmak yalnızca ilk ve son birkaç elemanını, ortada ... ile gösterir; böylece IDE terminali binlerce değerle dolmaz:
>>> print(np.arange(1000, dtype=np.uint16))
array([0, 1, 2, ..., 997, 998, 999], dtype=uint16)
set_printoptions(), hata ayıklama tüm arabelleğe ihtiyaç duyduğunda eşikleri geçersiz kılar:
np.set_printoptions(threshold=2000) # print up to 2000 elements in full
np.set_printoptions(edgeitems=10) # 10 items at each end, not 3
get_printoptions(), geçerli ayarları bir dict olarak geri okur.