Data dari berkas CSV, hasil API, atau input pengguna sering tiba dalam bentuk yang tidak siap dihitung: harga sebagai string "15000", suhu sebagai float64 yang perlu dijadikan integer, atau campuran tipe yang harus diseragamkan. NumPy menyediakan method astype untuk konversi tipe secara eksplisit. Bab ini membahas cara pakainya, dua perilaku yang paling sering menjebak pemula (truncation dan error konversi), serta jaminan bahwa astype selalu membuat array baru.
astype: Konversi Eksplisit Antar Tipe #
Method astype menerima tipe tujuan dan mengembalikan array baru dengan tipe tersebut. Array asli tidak berubah. Aturan yang wajib kita ingat: konversi float ke int memotong bagian desimal menuju nol (truncation), bukan membulatkan.
import numpy as np
suhu = np.array([2.7, 3.1, -2.7])
bulat = suhu.astype(np.int64)
print(bulat)
print(suhu.dtype)Output yang Dihasilkan:
[ 2 3 -2]
float64Mari kita bedah:
- Baris 3 (
np.array([2.7, 3.1, -2.7])): tanpa argumen tipe, NumPy menetapkanfloat64karena elemennya berisi desimal. - Baris 4 (
suhu.astype(np.int64)): NumPy mengonversi setiap elemen keint64dengan membuang bagian di belakang koma. Nilai2.7menjadi2, dan-2.7menjadi-2, bukan-3. - Baris 6 (
suhu.dtype): array asli tetapfloat64;astypetidak pernah mengubah array sumbernya.
Konversi String ke Angka #
String yang berisi angka bersih dapat langsung dikonversi dengan astype(np.float64). Ini jalur yang lazim setelah data teks dibersihkan. Namun jika ada satu saja elemen yang bukan angka valid, konversi gagal dengan ValueError.
import numpy as np
harga = np.array(["15000", "27.5", "999"])
print(harga.astype(np.float64))
rusak = np.array(["15000", "27,5"])
try:
rusak.astype(np.float64)
except ValueError as e:
print("ValueError:", e)Output yang Dihasilkan:
[15000. 27.5 999. ]
ValueError: could not convert string to float: np.str_('27,5')Penjelasan tiap bagian:
- Baris 3-4: string
"15000","27.5", dan"999"semuanya angka valid, sehinggaastypemenghasilkan arrayfloat64dengan nilai numerik sebenarnya. - Baris 7 (
rusak.astype(np.float64)): elemen"27,5"memakai koma sebagai pemisah desimal; Python dan NumPy hanya menerima titik, sehingga konversi berhenti denganValueError. - Baris 8-10 (try/except): blok error sengaja ditangkap agar program tetap berjalan; pesan galatnya mencantumkan elemen yang gagal, yaitu
'27,5', sehingga proses pelacakan berjalan cepat.
Perhatikan juga bahwa ValueError terjadi sekaligus untuk seluruh array: tidak ada konversi parsial yang dikembalikan. Bersihkan data string terlebih dahulu, atau tangkap errornya lalu perbaiki elemen yang bermasalah.
astype Selalu Menghasilkan Copy #
astype menyalin data ke blok memori baru. Perubahan pada hasil konversi tidak pernah menjalar ke array asal. Kita bisa memverifikasinya dengan atribut base: array hasil astype tidak memiliki array induk (base bernilai None) karena ia berdiri sendiri.
import numpy as np
asal = np.array([1, 2, 3], dtype=np.int32)
salin = asal.astype(np.float64)
print(salin.base is None)
salin[0] = 99.9
print(asal)
print(salin)Output yang Dihasilkan:
True
[1 2 3]
[99.9 2. 3. ]Interpretasi baris penting:
- Baris 4 (
asal.astype(np.float64)): karena tipe berubah dariint32kefloat64, NumPy wajib mengalokasikan memori baru dan menyalin nilainya. - Baris 5 (
salin.base is None): hasilnyaTrue, penanda bahwasalinbukan view dari array lain; data miliknya sendiri. - Baris 7-9: mengubah
salin[0]menjadi99.9tidak memengaruhiasal; kedua array kini berisi nilai yang berbeda.
Sifat copy ini sehat untuk kebenaran data, tetapi berbiaya memori bila array berukuran besar. Bila tipe data telah sesuai dan yang dibutuhkan hanya “memastikan” tipe tanpa menyalin ulang, gunakan np.asarray(); fungsi tersebut mengembalikan array yang sama tanpa penyalinan ketika tipe data telah cocok.