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 |
|---|---|---|
| 1 | 0 hingga 255 |
| 1 | -128 hingga 127 |
| 2 | 0 hingga 65.535 |
| 2 | -32.768 hingga 32.767 |
| 4 | IEEE 754 single precision |
| 1 |
|
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 |
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
semua |
|
|
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.