numpy.array2string

numpy.array2string(a, max_line_width=None, precision=None, suppress_small=None, separator=' ', prefix='', style=<no value>, formatter=None, threshold=None, edgeitems=None, sign=None, floatmode=None, suffix='', **kwarg)

Функция array2string() возвращает строковое представление массива.

Параметры:
a - массив NumPy или подобный массиву объект.
Входной массив.
max_line_width - целое число, (необязательный параметр).
Определяет максимальное количество символов в строке. Причем перенос строки будет происходить только после элемента исходного массива. Проще посмотреть пример, чем понять это определение.
precision - целое положительное число или None, (необязательный параметр).
Задает количество цифр после запятой для чисел с плавающей точкой. По умолчанию None, что соответствует текущей точности (как правило 8 знаков). Используемую по умолчанию точность можно изменить с помощью функции numpy.set_printoptions.
suppress_small - True или False, (необязательный параметр).
Если True и число меньше текущей точности печати то оно будет представлено, как 0. Если False то оно будет выведено в строку "как есть".
separator - строка, (необязательный параметр).
Разделитель между элементами, по умолчанию это ' ' - пробел.
prefix - строка, (необязательный параметр).
По умолчанию '' - пустая строка. Длина строки prefix используется для выравнивания строк по левому краю, т.е. слева, перед каждым переносом строки добавляется столько пробелов, сколько символов находится в строке prefix. Причем содержание строки prefix в выводе вообще никак не используется, а используется только длина данной строки.
suffix - строка, (необязательный параметр).
По умолчанию '' - пустая строка. Длина строки suffix используется для принудительного переноса в столбце max_line_width - len(suffix). Причем содержание строки suffix в выводе вообще никак не используется, а используется только длина данной строки.
style - <no value>, (необязательный параметр).
Вообще никак не используется и не оказывает абсолтно никакого эффекта. Считается устаревшим в NumPy с версии 1.14.0.
formatter - словарь или None, (необязательный параметр).

Если None (по умолчанию), то никакого дополнительного форматирования к определенным типам данных не применяется. Если в выводе присутствуют определенные типы данных, к которым необходимо применить определенное форматирование, то все необходимые действия можно перечислить в словаре. Ключами данного словаря являются метки типа данных, а значениями - необходимые функции форматирования. Указанные функции должны возвращать строки. Типы данных, которые не указаны в словаре, но присутствуют в выводе, форматируются используемыми по умолчанию методами.

Вот список отдельных типов данных к которым можно применять необходимое форматирование:

  • 'bool' - булев (True и False);
  • 'int' - целочисленный;
  • 'timedelta' - тип данных numpy.timedelta64;
  • 'datetime' - тип данных numpy.datetime64;
  • 'float' - вещественные числа (числа с плавающей точкой);
  • 'longfloat' - большие вещественные числа 128 бит;
  • 'complexfloat' - комплексные числа с вещественной и мнимой частью в виде вещественных чисел;
  • 'longcomplexfloat' - комплексные числа с вещественной и мнимой частью в виде вещественных чисел длинной 128 бит;
  • 'void' - numpy.void пустое значение;
  • 'numpystr' - строковое представление NumPy numpy.string_ или numpy.unicode_;
  • 'str' - Остальные строковые форматы.

Ключи определяющие группу типов данных:

  • 'all' - все типы данных;
  • 'int_kind' - все целочисленные типы данных;
  • 'float_kind' - 'float' и 'longfloat';
  • 'complex_kind' - 'complexfloat' и 'longcomplexfloat';
  • 'str_kind' - 'str' и 'numpystr'.

В случае, если функции форматирования не возвращают строки, то вызывается исключение TypeError.

threshold - целое число, (необязательный параметр).
Задает общее количество элементов массива, превышение которого запускает механизм сокращенного вывода. То есть, если a.size < threshold, то массив будет выведен целиком. По умолчанию установлен в значение None, что приводит к использованию текущего значения по умолчанию (1000 элементов).
edgeitems - целое число, (необязательный параметр).
Задает количество элементов в начале и конце каждого измерения.
sign - одна из строк: '+', '-' или ' ' (пустая строка), (необязательный параметр).
Задает формат печати знаков для вещественных чисел: '+' всегда печатается знак положительных значений; '-' заставляет пропускать знак положительных значений; '' (пустая строка) печатать пробел в позиции знака положительных чисел. Не действует для целых чисел.
floatmode - строка, (необязательный параметр).

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

  • 'fixed' - печать фиксированного количества дробных цифр, даже если это количество больше или меньше, чем необходимое для однозначного представления каждого элемента;
  • 'unique' - задает минимальное количество дробных цифр, которого достаточно для однозначного представления каждого элемента;
  • 'maxprec' - печать с максимальной точностью, но для элементов, которые могут быть однозначно представлены с меньшим количеством дробных цифр, печать выводится именно с этим количеством цифр;
  • 'maxprec_equal' - печать с максимальной точностью, но в случае возможности однозначного представления каждого элемента одинаковым меньшим количеством дробных цифр, то используется именно это одинаковое представление.
legacy - строка '1.13' или False, (необязательный параметр).
Если задана строка '1.13', то устанавливается режим печати используемый NumPy до версии 1.14.0. Если False то устаревший режим печати отключается. Доступно в NumPy с версии 1.14.0.
Возвращает:
str - строка Python
строковое представление исходного массива a.

Замечание

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

Если в параметре formatter для какого-то типа данных задана функция форматирования, то параметр precision для него игнорируется

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

Примеры

Если использовать данную функцию без каких либо необязательных параметров, то это приведет к простому строковому представлению исходного массива:

>>> import numpy as np
>>> 
>>> a = np.arange(8).reshape(2, 4)
>>> a
array([[0, 1, 2, 3],
       [4, 5, 6, 7]])
>>> 
>>> np.array2string(a)
'[[0 1 2 3]\n [4 5 6 7]]'
>>> 
>>> print(np.array2string(a))
[[0 1 2 3]
 [4 5 6 7]]

Параметр max_line_width позволяет задать максимальную длину строк между знаками переноса \n (причем, эти самые знаки переноса ставятся только после элементов исходного массива), что в свою очередь может повлиять на количество столбцов в выводе:

>>> print(np.array2string(a, max_line_width = 6))
[[0
  1
  2
  3]
 [4
  5
  6
  7]]
>>>
>>> print(np.array2string(a, max_line_width = 7))
[[0 1
  2 3]
 [4 5
  6 7]]
>>>
>>> print(np.array2string(a, max_line_width = 9))
[[0 1 2
  3]
 [4 5 6
  7]]
>>>
>>> print(np.array2string(a, max_line_width = 11))
[[0 1 2 3]
 [4 5 6 7]]

Как видите, перенос строки происходит только после элемента исходного массива, т.е. разбиения числа на части никогда не произойдет.

Параметр precision позволяет задать количество цифр после запятой - точность:

>>> a = np.random.rand(2, 2)
>>> a
array([[0.65322489, 0.54391426],
       [0.64331739, 0.72525091]])
>>> 
>>> np.array2string(a, precision = 4)
'[[0.6532 0.5439]\n [0.6433 0.7253]]'
>>> 
>>> np.array2string(a, precision = 2)
'[[0.65 0.54]\n [0.64 0.73]]'

Если какие-то числа окажутся меньше текущей точности печати, то с помощью параметра suppress_small можно определить их строковое представление True - представлять как ноль, False - представлять "как есть":

>>> a = np.random.rand(2, 2)
>>> a
array([[0.28086064, 0.34196146],
       [0.8406352 , 0.88221502]])
>>> 
>>> a[1] = 0.000001
>>> a
array([[2.80860638e-01, 3.41961461e-01],
       [1.00000000e-06, 1.00000000e-06]])
>>> 
>>> print(np.array2string(a, precision = 4, suppress_small = True))
[[0.2809 0.342 ]
 [0.     0.    ]]
>>> 
>>> print(np.array2string(a, precision = 4, suppress_small = False))
[[2.8086e-01 3.4196e-01]
 [1.0000e-06 1.0000e-06]]

По умолчанию, в качестве разделителя между элементами используется символ пробела ' ', но если кому-то нравится точка с запятой и пробелом '; ', то параметр separator позволяет задать свой разделитель:

>>> a = np.random.rand(2, 2)
>>> a
array([[0.71084314, 0.61932393],
       [0.26389227, 0.89718198]])
>>> 
>>> print(np.array2string(a))
[[0.71084314 0.61932393]
 [0.26389227 0.89718198]]
>>> 
>>> print(np.array2string(a, separator = '; '))
[[0.71084314; 0.61932393];
 [0.26389227; 0.89718198]]
>>> 
>>> print(np.array2string(a, separator = '-->'))
[[0.71084314-->0.61932393]-->
 [0.26389227-->0.89718198]]

Придумать какой-нибудь, более менее правдоподобный, пример для параметров prefix и suffix у меня не получается, но могу предположить, что данные параметры позволяют управлять отступами и переносами, на основе длины получаемых строк-чисел. Возможно как-то так:

>>> pre = '123'
>>> suf = '1'
>>> 
>>> a = np.random.rand(4, 3)
>>> a
array([[0.71091481, 0.08076292, 0.55869656],
       [0.54395423, 0.29177166, 0.01597694],
       [0.43728551, 0.29791532, 0.35485104],
       [0.52670866, 0.72536839, 0.90514475]])
>>> 
>>> print(np.array2string(a))
[[0.71091481 0.08076292 0.55869656]
 [0.54395423 0.29177166 0.01597694]
 [0.43728551 0.29791532 0.35485104]
 [0.52670866 0.72536839 0.90514475]]
>>> 
>>> print(np.array2string(a, prefix = pre))
[[0.71091481 0.08076292 0.55869656]
    [0.54395423 0.29177166 0.01597694]
    [0.43728551 0.29791532 0.35485104]
    [0.52670866 0.72536839 0.90514475]]
>>> 
>>>print(np.array2string(a, prefix = pre, max_line_width = 39))
[[0.71091481 0.08076292 0.55869656]
    [0.54395423 0.29177166 0.01597694]
    [0.43728551 0.29791532 0.35485104]
    [0.52670866 0.72536839 0.90514475]]
>>> 
>>> print(np.array2string(a, prefix = pre, max_line_width = 39, suffix = suf))
[[0.71091481 0.08076292
     0.55869656]
    [0.54395423 0.29177166
     0.01597694]
    [0.43728551 0.29791532
     0.35485104]
    [0.52670866 0.72536839
     0.90514475]]

В общем, не знаю зачем это нужно, но наверняка, раз это кто-то придумал, то кому-то это как-то помогло... и вероятность того, что это может хоть как-то пригодиться кому-то в будущем, все-таки есть, хоть и маленькая на мой взгляд.

Параметр formatter позволяет задать специфическое форматирование для отдельного типа данных. Например:

>>> a = np.arange(16).reshape(4, 4)
>>> a
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15]])
>>> 
>>> np.array2string(a, formatter = {'int': lambda x: bin(x)})
'[[0b0 0b1 0b10 0b11]\n [0b100 0b101 0b110 0b111]\n
 [0b1000 0b1001 0b1010 0b1011]\n [0b1100 0b1101 0b1110 0b1111]]'

Вообще, форматирование может быть сколь угодно сложным, в смысле, вы можете определять любые собственные функции форматирования:

>>> def my_format(x):
...     s = bin(x)
...     
... 
>>> def my_format(x, n):
...     s = bin(x)
...     if len(s) < n:
...         s = s + ' '*(n - len(s))
...     return s
... 
>>> print(np.array2string(a, formatter = {'int': lambda x: my_format(x, 7)}))
[[0b0     0b1     0b10    0b11   ]
 [0b100   0b101   0b110   0b111  ]
 [0b1000  0b1001  0b1010  0b1011 ]
 [0b1100  0b1101  0b1110  0b1111 ]]
>>> 
>>> print(np.array2string(a, formatter = {'int': lambda x: my_format(x, 15)}))
[[0b0             0b1             0b10            0b11           ]
 [0b100           0b101           0b110           0b111          ]
 [0b1000          0b1001          0b1010          0b1011         ]
 [0b1100          0b1101          0b1110          0b1111         ]]

Параметры threshold и edgeitems позволяют управлять выводом сокращенной формы больших массивов:

>>> a
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15]])
>>> 
>>> np.array2string(a, edgeitems = 1)
'[[ 0 ...  3]\n ...\n [12 ... 15]]'
>>> 
>>> print(np.array2string(a, edgeitems = 1))
[[ 0 ...  3]
 ...
 [12 ... 15]]
>>> 
>>> b = np.arange(1010)
>>> b
array([   0,    1,    2, ..., 1007, 1008, 1009])
>>> 
>>> print(np.array2string(b, edgeitems = 10))
[   0    1    2    3    4    5    6    7    8    9 ... 1000 1001 1002 1003
 1004 1005 1006 1007 1008 1009]
>>>
>>>
>>> print(np.array2string(b, threshold = 1005))
[   0    1    2 ... 1007 1008 1009]
>>>
>>> #  Теперь массивы будут выводиться полностью, только 
... #  если их длина меньше 1011:
>>> print(np.array2string(b, threshold = 1011))
[   0    1    2    3    4    5    6    7    8    9   10   11   12   13
   14   15   16   17   18   19   20   21   22   23   24   25   26   27
   28   29   30   31   32   33   34   35   36   37   38   39   40   41
   42   43   44   45   46   47   48   49   50   51   52   53   54   55
   56   57   58   59   60   61   62   63   64   65   66   67   68   69
   70   71   72   73   74   75   76   77   78   79   80   81   82   83
   84   85   86   87   88   89   90   91   92   93   94   95   96   97
   98   99  100  101  102  103  104  105  106  107  108  109  110  111
  112  113  114  115  116  117  118  119  120  121  122  123  124  125
  126  127  128  129  130  131  132  133  134  135  136  137  138  139
  140  141  142  143  144  145  146  147  148  149  150  151  152  153
  154  155  156  157  158  159  160  161  162  163  164  165  166  167
  168  169  170  171  172  173  174  175  176  177  178  179  180  181
  182  183  184  185  186  187  188  189  190  191  192  193  194  195
  196  197  198  199  200  201  202  203  204  205  206  207  208  209
  210  211  212  213  214  215  216  217  218  219  220  221  222  223
  224  225  226  227  228  229  230  231  232  233  234  235  236  237
  238  239  240  241  242  243  244  245  246  247  248  249  250  251
  252  253  254  255  256  257  258  259  260  261  262  263  264  265
  266  267  268  269  270  271  272  273  274  275  276  277  278  279
  280  281  282  283  284  285  286  287  288  289  290  291  292  293
  294  295  296  297  298  299  300  301  302  303  304  305  306  307
  308  309  310  311  312  313  314  315  316  317  318  319  320  321
  322  323  324  325  326  327  328  329  330  331  332  333  334  335
  336  337  338  339  340  341  342  343  344  345  346  347  348  349
  350  351  352  353  354  355  356  357  358  359  360  361  362  363
  364  365  366  367  368  369  370  371  372  373  374  375  376  377
  378  379  380  381  382  383  384  385  386  387  388  389  390  391
  392  393  394  395  396  397  398  399  400  401  402  403  404  405
  406  407  408  409  410  411  412  413  414  415  416  417  418  419
  420  421  422  423  424  425  426  427  428  429  430  431  432  433
  434  435  436  437  438  439  440  441  442  443  444  445  446  447
  448  449  450  451  452  453  454  455  456  457  458  459  460  461
  462  463  464  465  466  467  468  469  470  471  472  473  474  475
  476  477  478  479  480  481  482  483  484  485  486  487  488  489
  490  491  492  493  494  495  496  497  498  499  500  501  502  503
  504  505  506  507  508  509  510  511  512  513  514  515  516  517
  518  519  520  521  522  523  524  525  526  527  528  529  530  531
  532  533  534  535  536  537  538  539  540  541  542  543  544  545
  546  547  548  549  550  551  552  553  554  555  556  557  558  559
  560  561  562  563  564  565  566  567  568  569  570  571  572  573
  574  575  576  577  578  579  580  581  582  583  584  585  586  587
  588  589  590  591  592  593  594  595  596  597  598  599  600  601
  602  603  604  605  606  607  608  609  610  611  612  613  614  615
  616  617  618  619  620  621  622  623  624  625  626  627  628  629
  630  631  632  633  634  635  636  637  638  639  640  641  642  643
  644  645  646  647  648  649  650  651  652  653  654  655  656  657
  658  659  660  661  662  663  664  665  666  667  668  669  670  671
  672  673  674  675  676  677  678  679  680  681  682  683  684  685
  686  687  688  689  690  691  692  693  694  695  696  697  698  699
  700  701  702  703  704  705  706  707  708  709  710  711  712  713
  714  715  716  717  718  719  720  721  722  723  724  725  726  727
  728  729  730  731  732  733  734  735  736  737  738  739  740  741
  742  743  744  745  746  747  748  749  750  751  752  753  754  755
  756  757  758  759  760  761  762  763  764  765  766  767  768  769
  770  771  772  773  774  775  776  777  778  779  780  781  782  783
  784  785  786  787  788  789  790  791  792  793  794  795  796  797
  798  799  800  801  802  803  804  805  806  807  808  809  810  811
  812  813  814  815  816  817  818  819  820  821  822  823  824  825
  826  827  828  829  830  831  832  833  834  835  836  837  838  839
  840  841  842  843  844  845  846  847  848  849  850  851  852  853
  854  855  856  857  858  859  860  861  862  863  864  865  866  867
  868  869  870  871  872  873  874  875  876  877  878  879  880  881
  882  883  884  885  886  887  888  889  890  891  892  893  894  895
  896  897  898  899  900  901  902  903  904  905  906  907  908  909
  910  911  912  913  914  915  916  917  918  919  920  921  922  923
  924  925  926  927  928  929  930  931  932  933  934  935  936  937
  938  939  940  941  942  943  944  945  946  947  948  949  950  951
  952  953  954  955  956  957  958  959  960  961  962  963  964  965
  966  967  968  969  970  971  972  973  974  975  976  977  978  979
  980  981  982  983  984  985  986  987  988  989  990  991  992  993
  994  995  996  997  998  999 1000 1001 1002 1003 1004 1005 1006 1007
 1008 1009]

Параметр floatmode позволяет задать один из четырех режимов вывода вещественных чисел:

>>> a = np.random.rand(6, 3)
>>> a
array([[0.86163785, 0.95981443, 0.27651066],
       [0.01692821, 0.81334462, 0.41061902],
       [0.16459862, 0.91189802, 0.34259468],
       [0.24067266, 0.21481232, 0.95045351],
       [0.38674857, 0.06167984, 0.46205923],
       [0.30549893, 0.68043   , 0.72411459]])
>>> 
>>> print(np.array2string(a, floatmode = 'fixed'))
[[0.86163785 0.95981443 0.27651066]
 [0.01692821 0.81334462 0.41061902]
 [0.16459862 0.91189802 0.34259468]
 [0.24067266 0.21481232 0.95045351]
 [0.38674857 0.06167984 0.46205923]
 [0.30549893 0.68043000 0.72411459]]
>>> 
>>> print(np.array2string(a, floatmode = 'unique'))
[[0.8616378451753579   0.9598144308527106   0.27651065790653473 ]
 [0.016928205707199107 0.8133446197882634   0.41061901568134596 ]
 [0.16459861701145917  0.9118980193294314   0.3425946818011436  ]
 [0.24067266349745797  0.21481232451399979  0.9504535135376105  ]
 [0.38674856742348274  0.06167983696978341  0.46205923102388624 ]
 [0.30549893075772505  0.68042999974116     0.7241145909141042  ]]
>>> 
>>> print(np.array2string(a, floatmode = 'maxprec'))
[[0.86163785 0.95981443 0.27651066]
 [0.01692821 0.81334462 0.41061902]
 [0.16459862 0.91189802 0.34259468]
 [0.24067266 0.21481232 0.95045351]
 [0.38674857 0.06167984 0.46205923]
 [0.30549893 0.68043    0.72411459]]
>>> 
>>> print(np.array2string(a, floatmode = 'maxprec_equal'))
[[0.86163785 0.95981443 0.27651066]
 [0.01692821 0.81334462 0.41061902]
 [0.16459862 0.91189802 0.34259468]
 [0.24067266 0.21481232 0.95045351]
 [0.38674857 0.06167984 0.46205923]
 [0.30549893 0.68043000 0.72411459]]

Ну и наконец параметр sign, который позволяет настроить отображение знака перед вещественными числами:

>>> a = np.random.rand(2, 5) - 0.5
>>> a
array([[-0.09266392, -0.2619817 , -0.12624116, -0.15963228,  0.4037582 ],
       [-0.0179135 , -0.00542082, -0.19787545,  0.1944064 , -0.4276307 ]])
>>> 
>>> print(np.array2string(a, sign = '+'))
[[-0.09266392 -0.2619817  -0.12624116 -0.15963228 +0.4037582 ]
 [-0.0179135  -0.00542082 -0.19787545 +0.1944064  -0.4276307 ]]
>>> 
>>> print(np.array2string(a, sign = '-'))
[[-0.09266392 -0.2619817  -0.12624116 -0.15963228  0.4037582 ]
 [-0.0179135  -0.00542082 -0.19787545  0.1944064  -0.4276307 ]]
>>> 
>>> print(np.array2string(a, sign = ' '))
[[-0.09266392 -0.2619817  -0.12624116 -0.15963228  0.4037582 ]
 [-0.0179135  -0.00542082 -0.19787545  0.1944064  -0.4276307 ]]