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 - шестнадцатеричное целое число без знака.


Примеры

Сохранить в текстовый файл можно только одномерные и двумерные массивы:

>>> 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

В записи отдельных чисел присутствует очень много незначащих нулей. Управлять форматом записи чисел можно с помощью параметра fmt:

>>> 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

По умолчанию в качестве разделителя между числами используется строка ' ' - один пробел. Задать произвольный разделитель можно с помощью параметра delimiter:

>>> 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

По умолчанию в качестве разделителя между строками массива используется символ переноса строки '\n'. Задать произвольный разделитель можно с помощью параметра newline:

>>> 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