Коротко
np.save("x.npy", a)/np.load("x.npy")— один массив в двоичном формате.npy: быстро, тип и форма сохраняются точно.np.savez("x.npz", a=a, b=b)— несколько массивов в одном файле;loadвозвращает словарь-подобный объект.savez_compressed— со сжатием.np.savetxt/np.loadtxt— текст (CSV): читается людьми и другими программами, но медленнее и теряет точность приfmt.np.genfromtxtумеет пропуски: пустые поля становятсяnan.- Для таблиц с заголовками и разными типами столбцов удобнее pandas.read_csv.
Синтаксис
np.save("a.npy", a)
a = np.load("a.npy")
np.savez("data.npz", x=x, y=y) # или savez_compressed
data = np.load("data.npz"); data["x"]
np.savetxt("a.csv", a, delimiter=",", fmt="%.3f", header="")
np.loadtxt("a.csv", delimiter=",", skiprows=0, usecols=None, dtype=float)
np.genfromtxt("a.csv", delimiter=",", skip_header=0)Параметры
ПараметрЧто делаетПо умолчанию
delimiterразделитель полей в текстовом файле; None — любые пробелыNonefmtформат чисел при записи в savetxt, например "%.2f" или "%d""%.18e"headerстрока заголовка в savetxt; записывается с префиксом «# »""skiprows / skip_headerсколько строк пропустить в начале (loadtxt / genfromtxt)0usecolsкакие столбцы читать: номер или кортеж номеровNonedtypeтип результатаfloatПримеры
scores = np.array([[4.5, 3.0, 5.0],
[3.5, 4.0, 4.5]])np.save("scores.npy", scores) # двоичный формат NumPy: тип и форма сохраняются
np.load("scores.npy")Вывод
array([[4.5, 3. , 5. ],
[3.5, 4. , 4.5]])np.savez("data.npz", scores=scores, ids=np.array([101, 102]))
data = np.load("data.npz")
print(data.files)
data["ids"]Вывод
['scores', 'ids'] array([101, 102])
np.savetxt("scores.csv", scores, delimiter=",", fmt="%.1f", header="math,phys,chem")
with open("scores.csv") as f:
print(f.read())
np.loadtxt("scores.csv", delimiter=",") # строка заголовка начинается с # и пропускаетсяВывод
# math,phys,chem
4.5,3.0,5.0
3.5,4.0,4.5
array([[4.5, 3. , 5. ],
[3.5, 4. , 4.5]])with open("prices.csv", "w") as f:
f.write("id,price,qty\n1,120.5,3\n2,80.0,10\n")
np.loadtxt("prices.csv", delimiter=",", skiprows=1, usecols=(1, 2))Вывод
array([[120.5, 3. ],
[ 80. , 10. ]])with open("temps.csv", "w") as f:
f.write("day,temp\n1,12.5\n2,\n3,14.0\n")
np.genfromtxt("temps.csv", delimiter=",", skip_header=1) # пустое поле → nanВывод
array([[ 1. , 12.5],
[ 2. , nan],
[ 3. , 14. ]])Подводные камни
loadtxt не понимает пустые поля
Одно пустое значение — и чтение падает. Для файлов с пропусками используйте genfromtxt или pandas.
with open("temps.csv", "w") as f:
f.write("1,12.5\n2,\n3,14.0\n")
np.loadtxt("temps.csv", delimiter=",")Ошибка
ValueError: could not convert string '' to float64 at row 1, column 2.
np.load и pickle
np.load по умолчанию не загружает массивы объектов (allow_pickle=False): такой файл может выполнить произвольный код. Включайте allow_pickle=True только для файлов из надёжного источника.
records = np.array([{"id": 1}, None], dtype=object) # массив объектов Python
np.save("records.npy", records) # сохраняется через pickle
np.load("records.npy")Ошибка
ValueError: Object arrays cannot be loaded when allow_pickle=False