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:

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

text
<class 'list'> [[1.5, 2.5], [3.5, 4.5]]
7 <class 'int'>
4.5 <class 'float'>

Mari kita bedah:

  1. Baris 4-5 (a.tolist()): array 2-D menjadi list di dalam list; strukturnya meniru bentuk array, dan tiap elemennya adalah float Python murni.
  2. Baris 6-7 (np.array(7) + .item()): array 0-d (skalar) dikonversi menjadi int Python — tipe yang berbeda dari scalar NumPy int64.
  3. Baris 8: item() juga berlaku pada elemen tunggal hasil indexing, misalnya sebelum nilai dikirim ke fungsi yang menuntut float biasa.

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

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

text
b'\x01\x00\x02\x00\x03\x00'
6 6
[1 2 3] True

Penjelasan tiap bagian:

  1. Baris 4-5 (a.tobytes()): tiga elemen int16 menjadi enam byte; tiap elemen tampak sebagai pasangan byte dengan urutan little-endian.
  2. Baris 6 (len(bt), a.nbytes): panjang buffer identik dengan nbytes array — korespondensi yang dijanjikan format biner.
  3. Baris 7-8: frombuffer dengan dtype yang sama merekonstruksi array yang sama persis. Prinsip yang dipakai identik dengan tofile/fromfile pada Chapter Format Biner dan Teks, hanya sumbernya objek bytes Python, 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:

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

text
[15000 18000 35000]
['beras' 'gula' 'minyak'] <U6
<U21

Mari kita telaah:

  1. Baris 4-5 (np.fromiter(dagang.values(), ...)): nilai dict dialirkan langsung ke array int64 tanpa membuat list perantara; parameter count opsional dapat menambah efisiensi bila jumlahnya diketahui.
  2. Baris 6-7: kunci menjadi array string <U6 — tiap nama komoditas tersimpan sebagai Unicode.
  3. 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:

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

text
<class 'numpy.ndarray'>
[[1 2]
 [3 4]]
True

Penjelasan tiap bagian:

  1. Baris 5 (pickle.dumps(arr)): array diserialisasi menjadi objek bytes — bisa dikirim lewat jaringan atau ditulis ke berkas dengan pickle.dump.
  2. Baris 6-8 (pickle.loads(...)): serialisasi dibalik; hasilnya kembali ndarray yang identik.
  3. Batas pemakaian: format pickle adalah format Python-saja dan — lebih penting — data yang di-loads bisa menjalankan kode, bukan sekadar angka. Risiko itulah yang dibahas tuntas pada Chapter Keamanan saat Memuat Data; untuk berkas yang berasal dari luar, format .npy dengan bawaan allow_pickle=False lebih aman.