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.

python
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:

text
int64
float64
bool
<U3

Mari kita bedah keputusan yang diambil NumPy pada setiap konversi:

  1. Baris 3 (stok = ...): list berisi bilangan bulat menghasilkan int64, pilihan default NumPy untuk bilangan bulat.
  2. Baris 4 (harga = ...): saat satu elemen berupa pecahan, seluruh array dinaikkan ke float64 agar tidak ada nilai yang terpotong.
  3. Baris 5 (tersedia = ...): list boolean menghasilkan bool.
  4. Baris 6 (kode = ...): list string menghasilkan <U3, yaitu unicode dengan maksimum 3 karakter, mengikuti string terpanjang "P01".

Tabel berikut merangkum arti tiap notasi:

dtypeArti
int64bilangan bulat 64-bit, default untuk data bilangan bulat
float64bilangan pecahan 64-bit, dipilih saat ada elemen pecahan
boolnilai benar/salah
<U3string 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.

python
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:

text
float64
[1 2 3]
int64

Perhatikan mekanisme di balik setiap baris:

  1. Baris 3-4: list campuran bilangan bulat dan pecahan menghasilkan float64; NumPy memilih tipe yang menampung semua elemen tanpa kehilangan nilai.
  2. Baris 6 (dtype=np.int64): setiap elemen dikonversi secara paksa ke bilangan bulat 64-bit.
  3. Baris 7: hasilnya [1 2 3]; bagian pecahan 0.9, 0.5, dan 0.1 dipotong 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.

python
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:

text
int64 int64
str96 <U3
int64

Mari kita bandingkan ketiga baris output:

  1. Baris 6: untuk int64, dtype.name dan str(dtype) sama-sama menghasilkan 'int64'.
  2. Baris 7: untuk string, dtype.name menghasilkan 'str96' — angka 96 adalah total bit (3 karakter × 32 bit), sedangkan str(dtype) menghasilkan '<U3' yang menunjukkan jumlah karakter.
  3. 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.