Membuka arsip .npz memakai fungsi yang sama seperti memuat .npy — np.load — tetapi hasil yang dikembalikan berbeda: sebuah objek NpzFile, bukan ndarray. Objek ini berperan mirip dict: kita mendaftar kuncinya, lalu membaca array satu per satu lewat indeks kurung siku. Perilakunya lazy — array baru benar-benar dibaca dari berkas ketika kuncinya diakses, bukan saat arsip dibuka.

Bab ini membedah objek NpzFile dari tiga sisi: mengakses anggota, menjelajahi isi arsip secara programatik, dan menutup arsip dengan pola with. Seluruh contoh memakai arsip yang dibuat di awal blok kodenya sendiri, sehingga setiap blok dapat dijalankan berdiri sendiri.

Objek NpzFile dan Akses per Kunci #

Ketika np.load mendeteksi berkas .npz, fungsi itu membungkus arsip ZIP menjadi objek NpzFile. Perhatikan tipe, repr, dan cara aksesnya:

python
import numpy as np

suhu = np.array([27.5, 28.1, 26.9, 30.2])
harga = np.array([15000, 18000, 35000], dtype=np.int64)
np.savez("arsip.npz", suhu=suhu, harga=harga)
data = np.load("arsip.npz")
print(type(data))
print(data)
print(data.files)
print(data["harga"])

Output yang Dihasilkan:

text
<class 'numpy.lib.npyio.NpzFile'>
NpzFile 'arsip.npz' with keys: suhu, harga
['suhu', 'harga']
[15000 18000 35000]

Mari kita bedah:

  1. Baris 6-7: hasil np.load bertipe numpy.lib.npyio.NpzFile; repr-nya langsung menampilkan nama berkas dan daftar kunci.
  2. Baris 8 (data.files): atribut files adalah list berisi nama semua anggota, sesuai urutan pemasukan ke arsip.
  3. Baris 9 (data["harga"]): akses kunci membaca anggota terkait dari ZIP, menguraikan header .npy-nya, lalu mengembalikan ndarray dengan dtype asli.

Menjelajah Isi Arsip secara Programatik #

Karena .files adalah list biasa, isi arsip dapat diperiksa tanpa mengetahui namanya lebih dulu — misalnya untuk memvalidasi arsip hasil unduhan. Iterasi langsung atas objek NpzFile juga dapat dilakukan, dan kunci yang tidak ada memunculkan KeyError:

python
import numpy as np

suhu = np.array([27.5, 28.1], dtype=np.float64)
harga = np.array([15000, 18000], dtype=np.int64)
np.savez("arsip.npz", suhu=suhu, harga=harga)
data = np.load("arsip.npz")
for kunci in data:
    print(kunci, "->", data[kunci].dtype)
try:
    data["stok"]
except KeyError as e:
    print("KeyError:", e)

Output yang Dihasilkan:

text
suhu -> float64
harga -> int64
KeyError: 'stok is not a file in the archive'

Penjelasan tiap bagian:

  1. Baris 7-8 (loop for kunci in data): iterasi menghasilkan nama kunci satu per satu; di dalam loop kita membaca dtype tiap anggota untuk pemeriksaan cepat.
  2. Baris 9-11 (try/except): mengakses kunci yang tidak terdaftar memunculkan KeyError dengan pesan yang jelas menyebut nama kunci tersebut.
  3. Pola pemeriksaan seperti ini menjadi dasar validasi: cocokkan data.files dengan daftar kunci yang diharapkan sebelum array-nya dipakai.

Objek NpzFile menahan berkas ZIP terbuka. Pola paling aman adalah blok with, yang menutup arsip otomatis begitu blok selesai. Untuk melihat bahwa isi .npz memang berkas .npy biasa di dalam ZIP, kita intip juga dengan modul standar zipfile:

python
import numpy as np
import zipfile

suhu = np.array([27.5, 28.1])
harga = np.array([15000, 18000], dtype=np.int64)
np.savez("arsip.npz", suhu=suhu, harga=harga)
with np.load("arsip.npz") as data:
    print(data.files)
    print(data["suhu"])
with zipfile.ZipFile("arsip.npz") as z:
    print(z.namelist())

Output yang Dihasilkan:

text
['suhu', 'harga']
[27.5 28.1]
['suhu.npy', 'harga.npy']

Mari kita telaah:

  1. Baris 8-10 (with np.load(...) as data): selama blok berjalan, arsip terbuka dan array dapat dibaca; setelah blok selesai, NpzFile ditutup otomatis tanpa perintah tambahan.
  2. Baris 11-12 (zipfile.ZipFile): .npz dibuka sebagai ZIP biasa; namelist() memperlihatkan anggotanya: suhu.npy dan harga.npy.

Tabel ringkas pola akses:

PolaKegunaan
data["kunci"]membaca satu array dari arsip
data.filesmendaftar semua nama array
for kunci in datamemproses seluruh anggota satu per satu
with np.load(...) as datamembuka arsip lalu menutupnya otomatis