numpy.savetxt
numpy.savetxt(fname, X, fmt='%.18e', delimiter=' ', newline='\n', header='', footer='', comments='# ', encoding=None)
Функция savetxt() сохраняет массив в текстовый файл.
-
- fname - строка, файловый объект (дескриптор).
-
Имя файла или путь к файлу в который будет сохранен массив. Если указанного файла не существует, то он будет создан. Никакое расширение к файлу не добавляется, но может быть определено явно. Если указать расширение .gz, то данные буудут сохранены в сжатом формате gzip, файлы такого формата могут быть прочитаны с помощью функции
loadtxt()
. - X - 1 или 2-х мерный массив NumPy или подобный массиву объект.
- Массив который необходимо сохранить в файл.
- fmt - строка или последовательность строк (необязательный параметр).
-
Определяет формат в котором записываются числовые элементы в массив. Если указана одна строка с форматом, например
% 10.7i
, то этот формат распространяется на все сохраняемые элементы. Так же фозможно указать формат для каждого отдельного столбца в виде последовательности строк-форматов.Для комплексных чисел допустимы следующие способы указания форматов:
- один формат для мнимой и действительной части, например:
fmt = ’%. 4f’
, что приведет к форматированию чисел в виде‘(%s+%sj)’ % (fmt, fmt)
; - строка определяющая форматирование действительной и мнимой части каждого столбца, например:
‘% .4f% +. 4fj% .4f% +. 4fj’
для двух столбцов; - список строк форматов, но в этом случае действительная и мнимая части должны иметь отдельные форматы внутри каждой отдельной строки сриска, например:
[‘% 5.4f +% 5.4ej’, ‘(% 10.10f% +. 10.10ej)’]
для двух столбцов.
- один формат для мнимой и действительной части, например:
- delimiter - строка (необязательный параметр).
- Задает разделитель между элементами (столбцами) массива.
- newline - строка (необязательный параметр).
- Задает разделитель между строками массивов.
- header - строка (необязательный параметр).
- Строка которая будет записана в начале файла.
- footer - строка (необязательный параметр).
- Строка которая будет записана в конце файла.
- comments - строка (необязательный параметр).
-
Строка которая будет добавлена в начало строк
header
иfooter
. По умолчанию, это '#', который является стандартным символом для строк комментирования и ожидается функциейloadtxt()
. - encoding - None или строка (необязательный параметр).
- Определяет кодировку, используемую при записи данных в текстовый файл, но не влияет на потоки данных. Если кодировка отличается от 'bytes' или 'latin1', то открыть файлы в NumPy версии < 1.14 не получится. По умолчанию используется 'latin1'. Доступно в NumPy с версии 1.14.0
Замечание
Параметр fmt
позволяет задать формат в котором числа будут записаны в файл. Формат задается в виде строки вида %[flag]width[.precision]specifier
.
- flag
-
-
- выравнивание по левому краю.+
- запись перед знаками '+' или '-'.0
- добавляет слева перед числом нули вместо пробела.
- width
- Минимальное количество символов для записи. Если число состоит из большего количества знаков, то оно не усекается.
- precision
-
- минимальное количество цифр, которые буут использованы для записи целочисленных данных (
d,i,o,x
); - количество цифр после запятой для записи вещественных чисел (например,
e, E, f
); - максимальное количество значащих цифр для записи чисел (например,
g, G
); - максимальное количество символов для строк (
s
).
- минимальное количество цифр, которые буут использованы для записи целочисленных данных (
- specifier
-
c
- символ;d
илиi
- десятичное целое число со знаком;e
илиi
- запись в научной нотации с символами e или E;f
- десятичное число с плавающей точкой;g, G
- использование укороченных записей с символами e или E дляf
;o
- восьмеричное число со знаком;s
- строка символов;u
- десятичное целое число без знака;x, X
- шестнадцатеричное целое число без знака.
loadtxt
,
save
,
savez
,
savez_compressed
. Полное описание строк форматирования (англ)
Примеры
Сохранить в текстовый файл можно только одномерные и двумерные массивы:
>>> import numpy as np
>>>
>>> a = np.arange(10)
>>> a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>>
>>> np.savetxt('example/ex_0', a)
Содержимое файла ex_0
:
0.000000000000000000e+00 1.000000000000000000e+00 2.000000000000000000e+00 3.000000000000000000e+00 4.000000000000000000e+00 5.000000000000000000e+00 6.000000000000000000e+00 7.000000000000000000e+00 8.000000000000000000e+00 9.000000000000000000e+00
Файл не имеет никакого расширение, тем не менее он имеет текстовый формат и открывается любым текстовым редактором.
Сохранение двумерного массива:
>>> b = a.reshape(5, 2)
>>> b
array([[0, 1],
[2, 3],
[4, 5],
[6, 7],
[8, 9]])
>>>
>>> np.savetxt('example/ex_1', b)
Содержимое файла ex_1
:
0.000000000000000000e+00 1.000000000000000000e+00 2.000000000000000000e+00 3.000000000000000000e+00 4.000000000000000000e+00 5.000000000000000000e+00 6.000000000000000000e+00 7.000000000000000000e+00 8.000000000000000000e+00 9.000000000000000000e+00
В записи отдельных чисел присутствует очень много незначащих нулей. Управлять форматом записи чисел можно с помощью параметра
>>> c = np.random.randint(0, 300, size = (6, 6))
>>> c
array([[ 28, 286, 233, 162, 235, 220],
[148, 171, 187, 121, 58, 162],
[ 24, 176, 142, 202, 58, 275],
[101, 32, 30, 126, 128, 127],
[254, 78, 159, 225, 117, 45],
[125, 289, 109, 8, 284, 10]])
>>>
>>> np.savetxt('example/ex_2', c, fmt = '%3.0d')
Содержимое файла ex_2
:
28 286 233 162 235 220 148 171 187 121 58 162 24 176 142 202 58 275 101 32 30 126 128 127 254 78 159 225 117 45 125 289 109 8 284 10
По умолчанию в качестве разделителя между числами используется строка
>>> d = 1/np.random.randint(2, 10, size = (6, 5))
>>> d
array([[0.25 , 0.125 , 0.14285714, 0.125 , 0.125 ],
[0.5 , 0.2 , 0.11111111, 0.2 , 0.33333333],
[0.5 , 0.25 , 0.25 , 0.2 , 0.11111111],
[0.33333333, 0.14285714, 0.11111111, 0.25 , 0.2 ],
[0.16666667, 0.11111111, 0.11111111, 0.2 , 0.5 ],
[0.11111111, 0.5 , 0.14285714, 0.14285714, 0.5 ]])
>>>
>>> np.savetxt('example/ex_3', d, fmt = '%1.4f', delimiter = ', ')
Содержимое файла ex_3
:
0.2500, 0.1250, 0.1429, 0.1250, 0.1250 0.5000, 0.2000, 0.1111, 0.2000, 0.3333 0.5000, 0.2500, 0.2500, 0.2000, 0.1111 0.3333, 0.1429, 0.1111, 0.2500, 0.2000 0.1667, 0.1111, 0.1111, 0.2000, 0.5000 0.1111, 0.5000, 0.1429, 0.1429, 0.5000
По умолчанию в качестве разделителя между строками массива используется символ переноса строки
>>> e = 1/np.random.randint(2, 10, size = (6, 5))
>>> e
array([[0.11111111, 0.25 , 0.2 , 0.14285714, 0.33333333],
[0.33333333, 0.25 , 0.2 , 0.11111111, 0.125 ],
[0.14285714, 0.11111111, 0.16666667, 0.2 , 0.5 ],
[0.5 , 0.5 , 0.5 , 0.2 , 0.125 ],
[0.5 , 0.2 , 0.5 , 0.33333333, 0.25 ],
[0.14285714, 0.11111111, 0.14285714, 0.16666667, 0.11111111]])
>>>
>>> np.savetxt('example/ex_4',
e,
fmt = '%1.4f',
delimiter = ' | ',
newline = '\n' + '-'*42 + '\n')
Содержимое файла ex_4
:
0.1111 | 0.2500 | 0.2000 | 0.1429 | 0.3333 ------------------------------------------ 0.3333 | 0.2500 | 0.2000 | 0.1111 | 0.1250 ------------------------------------------ 0.1429 | 0.1111 | 0.1667 | 0.2000 | 0.5000 ------------------------------------------ 0.5000 | 0.5000 | 0.5000 | 0.2000 | 0.1250 ------------------------------------------ 0.5000 | 0.2000 | 0.5000 | 0.3333 | 0.2500 ------------------------------------------ 0.1429 | 0.1111 | 0.1429 | 0.1667 | 0.1111 ------------------------------------------
Форматирование комплексных чисел, возможно тремя разными способами. Самый простой, один формат для действительной и мнимой части каждого столбца:
>>> a = np.linspace(1 + 1j, 6 + 6j, 12).reshape(6, 2)
>>> a
array([[1. +1.j , 1.45454545+1.45454545j],
[1.90909091+1.90909091j, 2.36363636+2.36363636j],
[2.81818182+2.81818182j, 3.27272727+3.27272727j],
[3.72727273+3.72727273j, 4.18181818+4.18181818j],
[4.63636364+4.63636364j, 5.09090909+5.09090909j],
[5.54545455+5.54545455j, 6. +6.j ]])
>>>
>>> np.savetxt('example/ex_5', a, fmt = '%1.4f')
Однако, в этом случае, числа в кажом столбце будут автоматически заключены в круглые скобки. Содержимое файла ex_5
:
(1.0000+1.0000j) (1.4545+1.4545j) (1.9091+1.9091j) (2.3636+2.3636j) (2.8182+2.8182j) (3.2727+3.2727j) (3.7273+3.7273j) (4.1818+4.1818j) (4.6364+4.6364j) (5.0909+5.0909j) (5.5455+5.5455j) (6.0000+6.0000j)
Можно определить формат мнимой и действительной части отдельно в каждом столбце, для этого необходимо указать строку со всеми форматами:
np.savetxt('example/ex_5', a, fmt = '%1.3f %+0.3ej %1.3f %+0.3ej')
Содержимое файла ex_5
:
1.000 +1.000e+00j 1.455 +1.455e+00j 1.909 +1.909e+00j 2.364 +2.364e+00j 2.818 +2.818e+00j 3.273 +3.273e+00j 3.727 +3.727e+00j 4.182 +4.182e+00j 4.636 +4.636e+00j 5.091 +5.091e+00j 5.545 +5.545e+00j 6.000 +6.000e+00j
Определить формат мнимой и действительной части каждого столбца массива можно с помощью списка строк-форматов:
>>> np.savetxt('example/ex_5', a, fmt = ['(%0.3e %+0.3ej)', '%1.3f %+1.3fj'])
Содержимое файла ex_5
:
(1.000e+00 +1.000e+00j) 1.455 +1.455j (1.909e+00 +1.909e+00j) 2.364 +2.364j (2.818e+00 +2.818e+00j) 3.273 +3.273j (3.727e+00 +3.727e+00j) 4.182 +4.182j (4.636e+00 +4.636e+00j) 5.091 +5.091j (5.545e+00 +5.545e+00j) 6.000 +6.000j