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. Это связано с тем, что запись массива происходит прямиком в файл, без промежуточной записи в файловый объект.
Примеры
Если указать только строку с именем файла, то будет создан двоичный файл:
>>> 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,)