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.

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

text
[ 2  3 -2]
float64

Mari kita bedah:

  1. Baris 3 (np.array([2.7, 3.1, -2.7])): tanpa argumen tipe, NumPy menetapkan float64 karena elemennya berisi desimal.
  2. Baris 4 (suhu.astype(np.int64)): NumPy mengonversi setiap elemen ke int64 dengan membuang bagian di belakang koma. Nilai 2.7 menjadi 2, dan -2.7 menjadi -2, bukan -3.
  3. Baris 6 (suhu.dtype): array asli tetap float64; astype tidak 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.

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

text
[15000.     27.5   999. ]
ValueError: could not convert string to float: np.str_('27,5')

Penjelasan tiap bagian:

  1. Baris 3-4: string "15000", "27.5", dan "999" semuanya angka valid, sehingga astype menghasilkan array float64 dengan nilai numerik sebenarnya.
  2. Baris 7 (rusak.astype(np.float64)): elemen "27,5" memakai koma sebagai pemisah desimal; Python dan NumPy hanya menerima titik, sehingga konversi berhenti dengan ValueError.
  3. 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.

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

text
True
[1 2 3]
[99.9  2.   3. ]

Interpretasi baris penting:

  1. Baris 4 (asal.astype(np.float64)): karena tipe berubah dari int32 ke float64, NumPy wajib mengalokasikan memori baru dan menyalin nilainya.
  2. Baris 5 (salin.base is None): hasilnya True, penanda bahwa salin bukan view dari array lain; data miliknya sendiri.
  3. Baris 7-9: mengubah salin[0] menjadi 99.9 tidak memengaruhi asal; 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.