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 |
|---|---|---|
|
1 |
0 ile 255 arası |
|
1 |
-128 ile 127 arası |
|
2 |
0 ile 65.535 arası |
|
2 |
-32.768 ile 32.767 arası |
|
4 |
IEEE 754 tek hassasiyet |
|
1 |
|
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ç |
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
herhangi |
|
|
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.