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.