Нашли ошибку?
среднийNumPy 2.5.3

Сохранение и загрузка

Сохранить массив в файл и прочитать обратно — в двоичном формате NumPy или в текстовом CSV.

Нужно знать:Создание массивовТипы данных и astype

Содержание статьи

Коротко

  • 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 — любые пробелыNone
fmtформат чисел при записи в savetxt, например "%.2f" или "%d""%.18e"
headerстрока заголовка в savetxt; записывается с префиксом «# »""
skiprows / skip_headerсколько строк пропустить в начале (loadtxt / genfromtxt)0
usecolsкакие столбцы читать: номер или кортеж номеровNone
dtypeтип результатаfloat

Примеры

Данные для примеровиспользуются во всех примерах ниже
scores = np.array([[4.5, 3.0, 5.0],
                   [3.5, 4.0, 4.5]])
Один массив: .npy
np.save("scores.npy", scores)            # двоичный формат NumPy: тип и форма сохраняются
np.load("scores.npy")
Вывод
array([[4.5, 3. , 5. ],
       [3.5, 4. , 4.5]])
Несколько массивов: .npz
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])
Текстовый CSV
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.

Пустое поле в loadtxtошибка: ValueError
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 только для файлов из надёжного источника.

Массив объектов в .npyошибка: ValueError
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