6.4. Dtype’lar

Bir ndarray öğesinin eleman türü onun dtype‘ıdır. Dtype aynı anda üç şeye karar verir: her elemanın kaç bayt kapladığı, baytların nasıl yorumlandığı ve dizinin saklayabileceği değer aralığı. Doğru dtype’ı seçmek, kameradaki RAM kullanımını etkileyen en büyük tekil karardır.

6.4.1. Desteklenen dtype’lar

Kameradaki numpy, küçük bir dtype kümesini destekler:

dtype

bayt

aralık

uint8

1

0 ile 255 arası

int8

1

-128 ile 127 arası

uint16

2

0 ile 65.535 arası

int16

2

-32.768 ile 32.767 arası

float

4

IEEE 754 tek hassasiyet

bool

1

True / False

int32 veya int64 yoktur ve OpenMV’nin ulab derlemesi, isteğe bağlı complex dtype’ını etkinleştirmez.

Veriyi üreten donanıma uygun türü seçin. 8 bitlik bir ADC örneği uint8 ister; 12 bitlik bir ADC örneği uint16‘ya sığar; gri tonlamalı bir kameradan gelen bir parlaklık pikseli uint8‘e sığar – bu da varsayılan float‘ın maliyetlendireceği RAM’in dörtte birini tasarruf eder.

6.4.2. Varsayılan dtype

Dizi oluşturma üzerindeki her yapıcının varsayılan dtype’ı float‘tır. Sensör verisiyle çalışırken uygulamanın istediği şey nadiren budur. Doğal genişlik daha küçük olduğunda her zaman dtype= değerini açıkça geçirin:

sensor = np.array(samples, dtype=np.uint16)

Bir tamsayı dizisini dtype= argümanı olmadan yeniden sarmalamak, diziyi kopyalar ve float’a dönüştürür; bu hem zamana hem de RAM’e mal olur. Performans önemli olduğunda dtype’ı belirtin.

6.4.3. Mevcut bir dizinin dtype’ı

dtype, dizinin içsel olarak taşıdığı tamsayı tür koduyla dizinin dtype’ını geri okur:

a = np.array([1, 2, 3], dtype=np.uint8)
print(a.dtype)            # 66 (the integer value of ``'B'``)

Tür kodu tamsayıları, numpy modülünde açığa çıkarılan sabitlerle eşleşir – numpy.uint8, numpy.int8, numpy.uint16, numpy.int16, numpy.float, numpy.bool – dolayısıyla dtype’ı modül sabitiyle karşılaştırmak, bir betiğin bir dizinin ne içerdiğine göre dallanma şeklidir:

if a.dtype == np.uint8:
    ...  # uint8 branch

6.4.4. Yukarı dönüştürme kuralları

Farklı dtype’lara sahip iki dizi, aynı operatörün işlenenleri olabilir. numpy, sonuç türünü kısa bir tabloya göre seçer:

sol

sağ

sonuç

uint8

int8

int16

uint8

int16

int16

uint8

uint16

uint16

int8

int16

int16

int8

uint16

uint16

uint16

int16

float

herhangi

float

float

uint16 / int16 satırı doğrudan float‘a yükseltilir, çünkü kameradaki numpy‘de 32 bitlik bir tamsayı dtype’ı yoktur.

Bir ikili operatörün bir tarafında Python skaler değeri olduğunda, skaler, en küçük uygun dtype’a sahip tek elemanlı bir diziye dönüştürülür: 123 bir uint8 dizisine, -1000 bir int16‘ya, bir Python float‘ı ise float‘a dönüşür.

6.4.5. Tamsayı taşması sarmalanır

Aynı tamsayı dtype’ına sahip iki dizi üzerindeki işlemler, sonuç taşsa bile o dtype’ı korur. Taşan kısım sessizce atılır:

a = np.array([200, 200], dtype=np.uint8)
b = np.array([100, 100], dtype=np.uint8)
print(a + b)

Çıktı:

array([44, 44], dtype=uint8)

Sonuç 300 mod 256 == 44 olur. Bir ara değer, giriş dtype’ının izin verdiğinden daha fazla aralığa ihtiyaç duyduğunda önce tür dönüşümü yapın:

c = np.array(a, dtype=np.uint16) + b
# array([300, 300], dtype=uint16)

Bu kural her tamsayı operatörü için geçerlidir – +, -, *, //, %, &, |, ^. Float dizileri asla taşmaz (bunun yerine sonsuza yükselirler), bu nedenle tür dönüşümü hilesi yalnızca tamsayı durumunda gereklidir.