NumPy – это фундаментальная библиотека Python, предназначенная для численных вычислений. Эффективная работа с данными часто требует сохранения массивов в компактном и быстро загружаемом формате. Двоичный формат является отличным решением для этих целей. В этой статье мы подробно рассмотрим, как преобразовать массивы NumPy в двоичный формат, обсудим различные методы, их преимущества и недостатки, а также рассмотрим примеры использования.
Понимание двоичного формата и его применение с NumPy
Что такое двоичный формат и почему он важен?
Двоичный формат представляет собой способ хранения данных в виде последовательности нулей и единиц. В отличие от текстовых форматов, двоичный формат не требует преобразования чисел и других данных в символы, что делает его более компактным и быстрым для чтения и записи. Это особенно важно при работе с большими объемами числовых данных.
Преимущества использования двоичного формата для массивов NumPy
-
Экономия места: Двоичные файлы обычно занимают меньше места, чем текстовые, особенно для числовых данных.
-
Скорость: Чтение и запись двоичных файлов происходит быстрее, так как не требуется парсинг текста.
-
Сохранение типа данных: Двоичный формат позволяет точно сохранить типы данных массива NumPy (например,
int32,float64), что исключает потерю точности.
Основные методы преобразования массива NumPy в двоичный формат
NumPy предоставляет несколько способов сохранения массивов в двоичном формате. Рассмотрим наиболее распространенные.
Использование numpy.tofile(): запись и чтение
Метод numpy.tofile() записывает данные массива непосредственно в файл в двоичном формате. Это самый простой и быстрый способ, но он не сохраняет информацию о форме массива или типе данных. Поэтому при чтении данных необходимо знать эту информацию заранее.
import numpy as np
arr = np.array([[1, 2, 3], [4, 5, 6]], dtype=np.int32)
arr.tofile('my_array.bin')
# Чтение данных
arr_read = np.fromfile('my_array.bin', dtype=np.int32).reshape((2, 3))
print(arr_read)
Методы numpy.save() и numpy.savez()/numpy.savez_compressed()
-
numpy.save()сохраняет один массив в формате.npy, который включает в себя данные массива, его форму и тип данных. Это более удобный способ, чемtofile(), так как не нужно вручную указывать форму и тип данных при чтении. -
numpy.savez()позволяет сохранять несколько массивов в один файл.npz(архив). Каждому массиву присваивается имя.numpy.savez_compressed()делает то же самое, но с дополнительным сжатием данных.Реклама
import numpy as np
arr = np.array([[1, 2, 3], [4, 5, 6]], dtype=np.int32)
np.save('my_array.npy', arr)
# Чтение данных
arr_read = np.load('my_array.npy')
print(arr_read)
arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])
np.savez('my_arrays.npz', arr1=arr1, arr2=arr2)
# Чтение данных из .npz файла
data = np.load('my_arrays.npz')
print(data['arr1'])
print(data['arr2'])
Сравнение методов и выбор подходящего решения
Когда использовать tofile, save или savez?
-
tofile(): Подходит для случаев, когда важна максимальная скорость записи и размер файла, и вы готовы вручную управлять метаданными массива (форма, тип данных). -
save(): Рекомендуется, когда нужно сохранить один массив с сохранением информации о его форме и типе данных. Удобно и безопасно. -
savez()/savez_compressed(): Используйте, когда нужно сохранить несколько массивов в одном файле, особенно если важна экономия места (сsavez_compressed()).
Преобразование массива NumPy в байты для передачи или сериализации
Иногда требуется преобразовать массив NumPy в байтовую строку для передачи по сети или сериализации. Это можно сделать с помощью метода tobytes():
import numpy as np
arr = np.array([1, 2, 3], dtype=np.int32)
bytes_data = arr.tobytes()
print(bytes_data)
# Восстановление массива из байтов
arr_restored = np.frombuffer(bytes_data, dtype=np.int32)
print(arr_restored)
Обработка и чтение двоичных файлов NumPy
Чтение данных, сохраненных с помощью numpy.tofile()
Как упоминалось ранее, при чтении данных, сохраненных с помощью tofile(), необходимо знать форму и тип данных массива. Используйте numpy.fromfile() и метод reshape() для восстановления массива.
Чтение данных, сохраненных с помощью numpy.save() и numpy.savez()
Для чтения файлов, сохраненных с помощью save() и savez(), используйте функцию numpy.load(). Она автоматически восстанавливает форму, тип данных и значения массивов.
import numpy as np
# Чтение файла .npy
arr = np.load('my_array.npy')
print(arr.shape)
print(arr.dtype)
print(arr)
# Чтение файла .npz
data = np.load('my_arrays.npz')
print(data.files) # Список массивов в файле
print(data['arr1'])
print(data['arr2'])
Заключение
В этой статье мы рассмотрели различные способы преобразования массивов NumPy в двоичный формат в Python. Выбор подходящего метода зависит от конкретной задачи и требований к скорости, размеру файла и удобству использования. numpy.tofile() обеспечивает максимальную скорость и компактность, но требует ручного управления метаданными. numpy.save() и numpy.savez() предлагают более удобный и безопасный способ сохранения массивов, сохраняя информацию о форме и типе данных.