Berbeda dengan list Python yang bebas menampung tipe campuran dalam satu wadah, setiap array NumPy menampung elemen dengan satu tipe yang seragam. Keseragaman inilah sumber kecepatan NumPy, dan metadata yang mendeskripsikannya disimpan dalam atribut dtype. Membaca dtype menjadi kebiasaan penting setiap kali data masuk dari luar, karena tipe yang salah akan mengubah hasil perhitungan sekaligus konsumsi memori.
Membaca dtype dari array hasil konversi list #
Saat kita membuat array dari list Python, NumPy menebak tipe yang paling pas untuk seluruh elemennya. Empat contoh berikut memperlihatkan dtype yang paling sering kita jumpai.
import numpy as np
stok = np.array([12, 8, 25])
harga = np.array([15000, 22500.5, 9800])
tersedia = np.array([True, False, True])
kode = np.array(["P01", "P02", "P03"])
print(stok.dtype)
print(harga.dtype)
print(tersedia.dtype)
print(kode.dtype)Output yang Dihasilkan:
int64
float64
bool
<U3Mari kita bedah keputusan yang diambil NumPy pada setiap konversi:
- Baris 3 (
stok = ...): list berisi bilangan bulat menghasilkanint64, pilihan default NumPy untuk bilangan bulat. - Baris 4 (
harga = ...): saat satu elemen berupa pecahan, seluruh array dinaikkan kefloat64agar tidak ada nilai yang terpotong. - Baris 5 (
tersedia = ...): list boolean menghasilkanbool. - Baris 6 (
kode = ...): list string menghasilkan<U3, yaitu unicode dengan maksimum 3 karakter, mengikuti string terpanjang"P01".
Tabel berikut merangkum arti tiap notasi:
| dtype | Arti |
|---|---|
int64 | bilangan bulat 64-bit, default untuk data bilangan bulat |
float64 | bilangan pecahan 64-bit, dipilih saat ada elemen pecahan |
bool | nilai benar/salah |
<U3 | string unicode; U berarti unicode, 3 adalah jumlah karakter maksimum |
Menentukan dtype secara eksplisit #
Tebakan NumPy bisa kita timpa lewat argumen dtype=. Konstruktor tipe seperti np.int64 berperan ganda: sebagai kelas bilangan bulat 64-bit sekaligus sebagai nilai argumen dtype. Dua skenario paling umum adalah mengunci tipe agar konsisten dan menurunkan tipe agar hemat memori.
import numpy as np
campuran = np.array([15000, 22500.5])
print(campuran.dtype)
diskon = np.array([1.9, 2.5, 3.1], dtype=np.int64)
print(diskon)
print(diskon.dtype)Output yang Dihasilkan:
float64
[1 2 3]
int64Perhatikan mekanisme di balik setiap baris:
- Baris 3-4: list campuran bilangan bulat dan pecahan menghasilkan
float64; NumPy memilih tipe yang menampung semua elemen tanpa kehilangan nilai. - Baris 6 (
dtype=np.int64): setiap elemen dikonversi secara paksa ke bilangan bulat 64-bit. - Baris 7: hasilnya
[1 2 3]; bagian pecahan0.9,0.5, dan0.1dipotong menuju nol (truncation), bukan dibulatkan.
dtype.name dan str(dtype) #
Objek dtype punya dua representasi teks yang sering tertukar. Properti dtype.name memberi nama ringkas untuk keperluan log, sedangkan str(dtype) memberi notasi lengkap. Untuk tipe numerik keduanya identik; untuk string, hasilnya berbeda.
import numpy as np
stok = np.array([12, 8, 25])
kode = np.array(["P01", "P02"])
print(stok.dtype.name, str(stok.dtype))
print(kode.dtype.name, str(kode.dtype))
print(np.dtype(np.int64).name)Output yang Dihasilkan:
int64 int64
str96 <U3
int64Mari kita bandingkan ketiga baris output:
- Baris 6: untuk
int64,dtype.namedanstr(dtype)sama-sama menghasilkan'int64'. - Baris 7: untuk string,
dtype.namemenghasilkan'str96'— angka 96 adalah total bit (3 karakter × 32 bit), sedangkanstr(dtype)menghasilkan'<U3'yang menunjukkan jumlah karakter. - Baris 8:
np.dtype(np.int64)membungkus konstruktor tipe menjadi objek dtype resmi, dan namanya tetap'int64'.
Sebagai praktik, gunakan dtype.name saat kita menulis log atau perbandingan sederhana, dan str(dtype) saat notasi lengkap dibutuhkan, misalnya untuk menunjukkan urutan byte atau jumlah karakter string.