ndarray.tofile

ndarray.tofile(fid, sep="", format="%s")

Метод ndarray.tofile() записывает массив в текстовый или двоичный (по умолчанию) файл.

Параметры:
fid - строка, файловый объект.
Файл в который должен быть загружен массив.
sep - строка.
Определяет разделитель между элементами массива, который будет использован при записи в текстовый файл. По умолчанию sep = "" (равен пустой строке), что означает запись в двоичный файл. Сама запись в двоичный файл эквивалентна команде file.write(a.tobytes()).
format - строка.
Определяет формат в котором данные будут записаны в текстовый файл. Каждый элемент массива сначала преобразуется в ближайший тип данных Python, затем преобразуется в строку, а уже потом записывается в файл, согласно указанному формату “format” % item.

Замечание

Данная функция подходит для быстрого сохранения одномерных последовательностей, так как информация о форме массива не сохраняется. Если форма массива так же имеет большое значение, то лучше воспользоваться функциями save, savetxt, savez или savez_compressed.

Данные всегда записываются в строковом C-стиле, т.е. если элементы массива находятся в столбчатом стиле Fortran, то это приведет к смене индексации его элементов.

Получить доступ к данным, которые были сохранены этим методом можно с помощью функции np.fromfile().

Использование данного метода является очень удобным и быстрым. Но следует помнить что информация о порядке байтов в файле теряется, поэтому при передаче таких файлов между компьютерами с различным порядком байтов могут произойти ошибки. Самый простой способ преодоления этой проблемы, заключается в том что бы записывать данные в текстовый файл, указав необходимый разделитель в параметре sep. Однако, в случае записи больших массивов, это может привести к росту времени записи и объема файла.

Метод tofile() нельзя использовать при записи в файловые объекты, которые поддерживают сжатие данных, таких как GzipFile или объектами, которые не поддерживают функцию fileno (), таких как BytesIO. Это связано с тем, что запись массива происходит прямиком в файл, без промежуточной записи в файловый объект.

Смотрите так же:
loadtxt, fromfile, savez

Примеры

Если указать только строку с именем файла, то будет создан двоичный файл:

>>> import numpy as np
>>> 
>>> a = np.random.randint(10000, size = (5, 5))
>>> 
>>> a
array([[1670, 8277, 5281, 9808, 1190],
       [ 675, 1065, 9214, 8633, 2691],
       [1973, 3017, 2435, 8764, 6737],
       [8282, 3094,  223,  775, 1948],
       [3601, 5684, 7715, 7877, 1575]])

Загрузить массив из такого файла можно с помощью функции np.fromfile():

>>> b = np.fromfile('example/tofile_1')
>>> b
array([1.75637592e-310, 2.08125347e-310, 1.43234716e-311, ...,
       4.13364780e-311, 1.20614241e-310, 1.67149608e-310])

Но в данном примере загрузились совсем не те данные, все дело в том, что по умолчанию, чаще всего используется тип данных NumPy np.float, а массив который мы записали имеет тип данных np.int. Функция np.fromfile() позволяет указывать тип данных загружаемого массива. Однако, заметте, что при записи массива, теряется информация о его форме:

>>> b = np.fromfile('example/tofile_1', dtype = np.int)
>>> b
array([1670, 8277, 5281, ..., 7715, 7877, 1575])
>>> 
>>> b.shape
(25,)

Если указать параметр sep, то будет создан текстовый файл:

>>> a.tofile('example/tofile_2', sep = ';')

Данный файл действительно является текстовым, может быть открыт любым текстовым редактором, и прочитан функцией np.fromfile(). Однако, вся информация о форме массива снова утеряна:

>>> c = np.fromfile('example/tofile_2', sep = ';')
>>> c
array([1670., 8277., 5281., ..., 7715., 7877., 1575.])
>>> 
>>> c.shape
(25,)