6.4. Dtype

Tipe elemen dari suatu ndarray adalah dtype-nya. Dtype menentukan tiga hal sekaligus: berapa byte yang ditempati setiap elemen, bagaimana byte tersebut diinterpretasikan, dan rentang nilai apa yang dapat disimpan array. Memilih dtype yang tepat adalah satu-satunya keputusan terpenting yang memengaruhi penggunaan RAM pada kamera.

6.4.1. Dtype yang didukung

numpy pada kamera mendukung sekumpulan dtype yang terbatas:

dtype

byte

rentang

uint8

1

0 hingga 255

int8

1

-128 hingga 127

uint16

2

0 hingga 65.535

int16

2

-32.768 hingga 32.767

float

4

IEEE 754 single precision

bool

1

True / False

Tidak ada int32 atau int64, dan build ulab OpenMV tidak mengaktifkan dtype opsional complex.

Pilih tipe yang sesuai dengan hardware yang menghasilkan data. Sampel ADC 8-bit membutuhkan uint8; sampel ADC 12-bit muat dalam uint16; piksel luminansi dari kamera skala abu-abu muat dalam uint8 -- menghemat empat kali RAM dibanding biaya default float.

6.4.2. Dtype default

Dtype default dari setiap konstruktor di Membuat array adalah float. Ini jarang menjadi yang diinginkan aplikasi saat menangani data sensor. Berikan dtype= secara eksplisit setiap kali lebar alami lebih kecil:

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

Membungkus ulang array integer tanpa argumen dtype= akan menyalin dan mengonversi ke float, yang memakan waktu sekaligus RAM. Bila performa penting, sebutkan dtype-nya.

6.4.3. Dtype dari array yang sudah ada

dtype membaca kembali dtype array sebagai kode tipe integer yang dibawa array secara internal:

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

Integer kode tipe cocok dengan konstanta yang diekspos pada modul numpy -- numpy.uint8, numpy.int8, numpy.uint16, numpy.int16, numpy.float, numpy.bool -- sehingga membandingkan dtype dengan konstanta modul adalah cara skrip membuat percabangan berdasarkan isi array:

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

6.4.4. Aturan upcasting

Dua array dengan dtype berbeda dapat menjadi operan dari operator yang sama. numpy memilih tipe hasil berdasarkan tabel singkat:

kiri

kanan

hasil

uint8

int8

int16

uint8

int16

int16

uint8

uint16

uint16

int8

int16

int16

int8

uint16

uint16

uint16

int16

float

semua

float

float

Baris uint16 / int16 langsung dipromosikan ke float karena numpy pada kamera tidak memiliki dtype integer 32-bit.

Ketika operator biner memiliki skalar Python di salah satu sisinya, skalar tersebut dikonversi ke array satu elemen dengan dtype terkecil yang sesuai: 123 menjadi array uint8, -1000 menjadi int16, Python float menjadi float.

6.4.5. Overflow integer membungkus

Operasi pada dua array dengan dtype integer yang sama mempertahankan dtype tersebut, bahkan ketika hasilnya overflow. Carry-nya diam-diam dibuang:

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

Output:

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

Hasilnya adalah 300 mod 256 == 44. Ketika nilai antara membutuhkan rentang lebih besar dari yang diizinkan dtype masukan, lakukan cast terlebih dahulu:

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

Aturan ini berlaku untuk setiap operator integer -- +, -, *, //, %, &, |, ^. Array float tidak pernah overflow (mereka dipromosikan ke infinity sebagai gantinya), sehingga trik cast hanya diperlukan pada kasus integer.