np.savetxt() și np.loadtxt() în NumPy

Fișiere NumPy 1.0+

Scrie un tablou într-un fișier text sau CSV (np.savetxt) și îl citește înapoi (np.loadtxt, np.genfromtxt pentru valori lipsă).

Sintaxă
np.savetxt(fname, X, fmt='%.18e', delimiter=' ', header='', comments='# ')
np.loadtxt(fname, dtype=float, delimiter=None, skiprows=0, usecols=None)
np.genfromtxt(fname, delimiter=None, skip_header=0, filling_values=None, names=None)

Ce face np.savetxt() și np.loadtxt()

np.savetxt() scrie un tablou 1D sau 2D într-un fișier text, câte un rând pe linie. Pentru CSV dai delimiter=",". Formatul implicit (fmt='%.18e') scrie numerele în notație științifică, greu de citit; cu fmt='%d' pentru întregi sau fmt='%.2f' pentru două zecimale obții un fișier curat. header adaugă un rând de antet, care implicit începe cu #; cu comments='' antetul este scris fără #, ca într-un CSV obișnuit.

np.loadtxt() citește fișierul înapoi într-un tablou. Rândurile care încep cu # sunt ignorate; un antet fără # îl sari cu skiprows=1. usecols alege doar anumite coloane. Toate valorile trebuie să fie numere (sau de tipul dat în dtype) și să nu lipsească.

np.genfromtxt() este varianta mai tolerantă: celulele goale devin nan (sau valoarea din filling_values), iar cu names=True folosește primul rând ca nume de coloane. Pentru tabele cu text și numere amestecate, pandas (pd.read_csv) este de obicei alegerea mai simplă.

Parametri

Parametru Descriere
fname Numele fișierului.
X La savetxt: tabloul 1D sau 2D.
fmt Formatul numerelor, de exemplu '%d', '%.2f' sau o listă cu câte un format pe coloană.
delimiter Separatorul de coloane; ',' pentru CSV.
header, comments Antetul și prefixul lui (implicit '# ').
skiprows / skip_header Câte rânduri de la început se sar la citire.
usecols Coloanele de citit, de exemplu (0, 2).
dtype Tipul valorilor citite (implicit float).

Ce returnează

savetxt: None. loadtxt/genfromtxt: un tablou (structurat, cu nume de coloane, dacă names=True).

Exemple

Exemplul 1: Scrierea și citirea unui CSV

import numpy as np

note = np.array([[9, 8, 10], [6, 7, 5], [10, 9, 9]])
np.savetxt("note.csv", note, fmt="%d", delimiter=",", header="mate,romana,info", comments="")

with open("note.csv", encoding="utf-8") as f:
    print(f.read())

citit = np.loadtxt("note.csv", delimiter=",", skiprows=1, dtype=int)
print(citit)
print("Medii pe materie:", citit.mean(axis=0).round(2))

Rezultat

mate,romana,info
9,8,10
6,7,5
10,9,9

[[ 9  8 10]
 [ 6  7  5]
 [10  9  9]]
Medii pe materie: [8.33 8.   8.  ]

Exemplul 2: Formatul numerelor și coloane alese

import numpy as np

preturi = np.array([[1, 4.5], [2, 7.0], [3, 12.25]])
np.savetxt("implicit.txt", preturi[:1])
np.savetxt("preturi.csv", preturi, fmt=["%d", "%.2f"], delimiter=",", header="cod,pret")

for nume in ["implicit.txt", "preturi.csv"]:
    with open(nume, encoding="utf-8") as f:
        print(f.read())
print(np.loadtxt("preturi.csv", delimiter=",", usecols=1))

Rezultat

1.000000000000000000e+00 4.500000000000000000e+00

# cod,pret
1,4.50
2,7.00
3,12.25

[ 4.5   7.   12.25]

Exemplul 3: Valori lipsă cu genfromtxt

Celula goală devine nan; cu names=True coloanele se iau după numele din antet.

import numpy as np

with open("temperaturi.csv", "w", encoding="utf-8") as f:
    f.write("iasi,cluj\n12.5,10.0\n,11.5\n14.0,\n")

date = np.genfromtxt("temperaturi.csv", delimiter=",", skip_header=1)
print(date)
print("Media Iași:", np.nanmean(date[:, 0]))

tabel = np.genfromtxt("temperaturi.csv", delimiter=",", names=True)
print(tabel["cluj"])

Rezultat

[[12.5 10. ]
 [ nan 11.5]
 [14.   nan]]
Media Iași: 13.25
[10.  11.5  nan]

Greșeli frecvente

  • Lași fmt implicit și obții fișiere cu 9.000000000000000000e+00. Dă un format: fmt='%d' sau fmt='%.2f'.
  • Citești un CSV fără delimiter=",": implicit loadtxt separă după spații, nu găsește numere în 9,8,10 și dă ValueError.
  • Folosești np.loadtxt() pe un fișier cu celule goale sau cu text și primești ValueError. Pentru valori lipsă folosește np.genfromtxt(); pentru tabele cu text, pandas.

Comenzi înrudite

  • np.save() și np.load(): Salvează tablouri în format binar NumPy (.npy, .npz) și le încarcă înapoi cu forma și tipul exact.
  • np.nan și funcțiile nan*: Lucrul cu valori lipsă: np.nan, np.isnan și funcțiile nansum, nanmean, nanmin, nanmax care ignoră NaN.
  • ndarray.dtype: Arată tipul elementelor dintr-un tablou (int64, float64, bool etc.) și câți octeți ocupă fiecare.