Tidak semua bagian program bekerja dengan ndarray. Fungsi bawaan Python, pustaka pihak ketiga yang belum mendukung NumPy, JSON serializer, hingga API yang menerima list — semuanya meminta data dalam wadah Python murni. Sebaliknya, data yang datang dari dict atau buffer byte perlu diubah menjadi ndarray sebelum bisa dihitung dengan cepat.
Bab ini mengulas jalur konversi dua arah antara ndarray dan dunia Python: tolist dan item untuk keluar, np.array/np.fromiter untuk masuk, tobytes/frombuffer untuk pertukaran biner, serta modul pickle untuk penyimpanan objek Python — lengkap dengan catatan keamanannya.
tolist dan item: Keluar Menuju Python Murni #
Method tolist() mengubah array menjadi list bersarang, sedangkan item() mengekstrak satu nilai menjadi objek Python asli — bukan lagi scalar NumPy:
import numpy as np
a = np.array([[1.5, 2.5], [3.5, 4.5]])
b = a.tolist()
print(type(b), b)
s = np.array(7)
print(s.item(), type(s.item()))
print(a[1, 1].item(), type(a[1, 1].item()))Output yang Dihasilkan:
<class 'list'> [[1.5, 2.5], [3.5, 4.5]]
7 <class 'int'>
4.5 <class 'float'>Mari kita bedah:
- Baris 4-5 (
a.tolist()): array 2-D menjadi list di dalam list; strukturnya meniru bentuk array, dan tiap elemennya adalahfloatPython murni. - Baris 6-7 (
np.array(7)+.item()): array 0-d (skalar) dikonversi menjadiintPython — tipe yang berbeda dari scalar NumPyint64. - Baris 8:
item()juga berlaku pada elemen tunggal hasil indexing, misalnya sebelum nilai dikirim ke fungsi yang menuntutfloatbiasa.
tobytes dan frombuffer: Pertukaran Biner #
Pada tingkat paling rendah, sebuah array adalah deretan byte. tobytes() mengekspor deret itu, dan np.frombuffer() membacanya kembali tanpa menyalin data (view atas buffer yang sama):
import numpy as np
a = np.array([1, 2, 3], dtype=np.int16)
bt = a.tobytes()
print(bt)
print(len(bt), a.nbytes)
b = np.frombuffer(bt, dtype=np.int16)
print(b, np.array_equal(a, b))Output yang Dihasilkan:
b'\x01\x00\x02\x00\x03\x00'
6 6
[1 2 3] TruePenjelasan tiap bagian:
- Baris 4-5 (
a.tobytes()): tiga elemenint16menjadi enam byte; tiap elemen tampak sebagai pasangan byte dengan urutan little-endian. - Baris 6 (
len(bt), a.nbytes): panjang buffer identik dengannbytesarray — korespondensi yang dijanjikan format biner. - Baris 7-8:
frombufferdengan dtype yang sama merekonstruksi array yang sama persis. Prinsip yang dipakai identik dengantofile/fromfilepada Chapter Format Biner dan Teks, hanya sumbernya objekbytesPython, bukan berkas.
Membangun Array dari dict #
dict Python adalah wadah data berlabel paling umum. Nilai-nilainya dapat diubah menjadi array numerik lewat np.fromiter, sedangkan kuncinya menjadi array string. Perhatikan apa yang terjadi bila pasangan kunci-nilai dikonversi sekaligus:
import numpy as np
dagang = {"beras": 15000, "gula": 18000, "minyak": 35000}
nilai = np.fromiter(dagang.values(), dtype=np.int64)
print(nilai)
nama = np.array(list(dagang.keys()))
print(nama, nama.dtype)
pasangan = np.array(list(dagang.items()))
print(pasangan.dtype)Output yang Dihasilkan:
[15000 18000 35000]
['beras' 'gula' 'minyak'] <U6
<U21Mari kita telaah:
- Baris 4-5 (
np.fromiter(dagang.values(), ...)): nilai dict dialirkan langsung ke arrayint64tanpa membuat list perantara; parametercountopsional dapat menambah efisiensi bila jumlahnya diketahui. - Baris 6-7: kunci menjadi array string
<U6— tiap nama komoditas tersimpan sebagai Unicode. - Baris 8-9:
dagang.items()mencampur string dan bilangan dalam satu array; NumPy meredam perbedaan itu dengan mem-promosikan semuanya menjadi string<U21. Mencampur tipe dalam satu array hampir selalu bukan yang dimaksud — pisahkan kunci dan nilainya.
pickle: Jembatan dengan Modul Standar #
Modul pickle dari pustaka standar Python dapat menyimpan dan memuat ndarray apa adanya, termasuk array berdtype object yang tidak dapat disimpan .npy tanpa izin khusus. Untuk data yang benar-benar tertutup — bukan berasal dari sumber tak dikenal — pemakaiannya sederhana:
import numpy as np
import pickle
arr = np.array([[1, 2], [3, 4]])
byte = pickle.dumps(arr)
arr2 = pickle.loads(byte)
print(type(arr2))
print(arr2)
print(np.array_equal(arr, arr2))Output yang Dihasilkan:
<class 'numpy.ndarray'>
[[1 2]
[3 4]]
TruePenjelasan tiap bagian:
- Baris 5 (
pickle.dumps(arr)): array diserialisasi menjadi objekbytes— bisa dikirim lewat jaringan atau ditulis ke berkas denganpickle.dump. - Baris 6-8 (
pickle.loads(...)): serialisasi dibalik; hasilnya kembalindarrayyang identik. - Batas pemakaian: format pickle adalah format Python-saja dan — lebih penting — data yang di-
loadsbisa menjalankan kode, bukan sekadar angka. Risiko itulah yang dibahas tuntas pada Chapter Keamanan saat Memuat Data; untuk berkas yang berasal dari luar, format.npydengan bawaanallow_pickle=Falselebih aman.