np.save() și np.load() în NumPy

Fișiere NumPy 1.0+

Salvează tablouri în format binar NumPy (.npy, .npz) și le încarcă înapoi cu forma și tipul exact.

Sintaxă
np.save(fisier, arr)
np.load(fisier, mmap_mode=None, allow_pickle=False)
np.savez(fisier, nume1=arr1, nume2=arr2, ...)
np.savez_compressed(fisier, nume1=arr1, ...)

Ce face np.save() și np.load()

np.save() scrie un singur tablou într-un fișier .npy (extensia se adaugă singură dacă lipsește). Formatul este binar și păstrează exact forma (shape) și tipul (dtype), deci np.load() îți dă înapoi același tablou. Fișierul nu se poate citi într-un editor de text sau în Excel; pentru asta folosește np.savetxt().

np.savez() pune mai multe tablouri într-o singură arhivă .npz, fiecare cu un nume dat ca argument (note=..., medii=...). np.load() pe un .npz returnează un obiect asemănător unui dicționar, din care iei tablourile după nume; îl deschizi cu with ca fișierul să fie închis la final. np.savez_compressed() face același lucru, dar comprimă datele: fișierul e mai mic, mai ales pentru date care se repetă.

Implicit np.load() are allow_pickle=False: refuză tablourile de obiecte Python, pentru că un fișier pickle primit de la altcineva poate rula cod. Activează opțiunea doar pentru fișiere în care ai încredere.

Parametri

Parametru Descriere
fisier Numele fișierului (sau un obiect fișier deschis în mod binar).
arr La save: tabloul de salvat.
nume=arr La savez/savez_compressed: tablourile, fiecare cu numele sub care va fi găsit în arhivă.
mmap_mode La load: 'r' deschide un fișier .npy mare fără să-l încarce tot în memorie.
allow_pickle La load: permite tablouri de obiecte Python (implicit False).

Ce returnează

save/savez: None. load: un tablou pentru .npy sau un obiect NpzFile (ca un dicționar) pentru .npz.

Exemple

Exemplul 1: Un tablou în fișier .npy

import numpy as np

note = np.array([[9, 8, 10], [6, 7, 5]], dtype=np.int16)
np.save("note", note)

citit = np.load("note.npy")
print(citit)
print(citit.dtype, citit.shape)
print(np.array_equal(note, citit))

Rezultat

[[ 9  8 10]
 [ 6  7  5]]
int16 (2, 3)
True

Exemplul 2: Mai multe tablouri într-un .npz

import numpy as np

orase = np.array(["Iași", "Cluj", "Brașov"])
vanzari = np.array([1200.5, 980.0, 1430.25])
np.savez("raport.npz", orase=orase, vanzari=vanzari)

with np.load("raport.npz") as date:
    print(sorted(date.files))
    print(date["orase"])
    print(date["vanzari"].sum())

Rezultat

['orase', 'vanzari']
['Iași' 'Cluj' 'Brașov']
3610.75

Exemplul 3: Arhivă comprimată

Datele cu multe valori repetate se comprimă bine, deci fișierul .npz comprimat este mult mai mic.

import os
import numpy as np

zile = np.zeros(100_000)
zile[::1000] = 1.5
np.savez("normal.npz", zile=zile)
np.savez_compressed("comprimat.npz", zile=zile)

normal = os.path.getsize("normal.npz")
comprimat = os.path.getsize("comprimat.npz")
print("Comprimat mai mic:", comprimat < normal)
print("Raport sub 5%:", comprimat / normal < 0.05)

with np.load("comprimat.npz") as date:
    print(date["zile"].sum())

Rezultat

Comprimat mai mic: True
Raport sub 5%: True
150.0

Greșeli frecvente

  • Salvezi cu np.save("note", a) și încarci cu np.load("note"): fișierul se numește de fapt note.npy, deci dai FileNotFoundError. Scrie extensia la încărcare.
  • Încerci să deschizi un .npy în Excel sau într-un editor: este binar. Pentru un fișier text/CSV folosește np.savetxt().
  • Dai tablourile lui np.savez() fără nume (np.savez("f.npz", a, b)): primesc numele automate arr_0, arr_1. Dă-le nume cu note=a.

Comenzi înrudite

  • np.savetxt() și np.loadtxt(): Scrie un tablou într-un fișier text sau CSV (np.savetxt) și îl citește înapoi (np.loadtxt, np.genfromtxt pentru valori lipsă).
  • ndarray.dtype: Arată tipul elementelor dintr-un tablou (int64, float64, bool etc.) și câți octeți ocupă fiecare.
  • np.array(): Creează un tablou NumPy (ndarray) dintr-o listă, o listă de liste sau alt obiect asemănător.