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.