Formatowanie w tablicy numpy [duplikat]

to pytanie ma już odpowiedzi tutaj : Jak ładnie wydrukować numpy.tablica bez notacji naukowej i z określoną precyzją? (14 odpowiedzi) Zamknięte w zeszłym roku .

Jeśli mam taką tablicę numpy:

[2.15295647e+01, 8.12531501e+00, 3.97113829e+00, 1.00777250e+01]

Jak mogę przesunąć punkt dziesiętny i sformatować liczby, aby skończyć z tablicą numpy taką jak ta:

[21.53, 8.13, 3.97, 10.08]

np.around(a, decimals=2) tylko daje mi [2.15300000e+01, 8.13000000e+00, 3.97000000e+00, 1.00800000e+01], Czego nie chcę i nie znalazłem innego sposobu, aby to zrobić.

Author: misterbear, 2014-01-08

4 answers

Aby numpywyświetlała tablice float w dowolnym formacie, można zdefiniować niestandardową funkcję, która przyjmuje wartość float jako dane wejściowe i zwraca sformatowany łańcuch znaków:

In [1]: float_formatter = "{:.2f}".format

f tutaj oznacza format stałopunktowy (nie "naukowy"), a .2 oznacza dwa miejsca po przecinku (więcej o formatowaniu łańcuchów tutaj ).

Przetestujmy go z wartością float:

In [2]: float_formatter(1.234567E3)
Out[2]: '1234.57'

Aby numpy wydrukował wszystkie tablice float w ten sposób, można podaj argument formatter= do np.set_printoptions:

In [3]: np.set_printoptions(formatter={'float_kind':float_formatter})

Teraz numpy wyświetli wszystkie tablice float w ten sposób:

In [4]: np.random.randn(5) * 10
Out[4]: array([5.25, 3.91, 0.04, -1.53, 6.68]

Zauważ, że dotyczy to tylko tablic numpy, a nie skalarów:

In [5]: np.pi
Out[5]: 3.141592653589793

Nie wpłynie to również na nie-pływaki, złożone pływaki itp . - będziesz musiał zdefiniować oddzielne formattery dla innych typów skalarnych.

Należy również mieć świadomość, że to tylko wpływa na sposób wyświetlania wartości zmiennoprzecinkowych numpy - rzeczywiste wartości, które zostaną użyte w obliczeniach, zachowają swoje oryginalna precyzja.

Na przykład:

In [6]: a = np.array([1E-9])

In [7]: a
Out[7]: array([0.00])

In [8]: a == 0
Out[8]: array([False], dtype=bool)

Numpy drukuje a tak, jakby było równe 0, ale tak nie jest - nadal jest równe 1E-9.

Jeśli chcesz zaokrąglać wartości w tablicy w sposób, który wpływa na sposób ich użycia w obliczeniach, powinieneś użyć np.round, Jak już zauważyli inni.

 85
Author: ali_m,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-11-22 11:42:29

Mylisz precyzję i precyzję wyświetlania. Zaokrąglenie dziesiętne nie może być dokładnie reprezentowane w postaci binarnej. Powinieneś spróbować:

> np.set_printoptions(precision=2)
> np.array([5.333333])
array([ 5.33])
 36
Author: U2EF1,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-08 23:37:44

Możesz użyć funkcji okrągłej. Oto przykład

numpy.round([2.15295647e+01, 8.12531501e+00, 3.97113829e+00, 1.00777250e+01],2)
array([ 21.53,   8.13,   3.97,  10.08])

Jeśli chcesz zmienić tylko wyświetlanie reprezentacji, ja bym Nie zalecał zmianę formatu drukowania globalnie, jak sugerowano powyżej. Sformatowałbym swoje wyjście na miejscu.

>>a=np.array([2.15295647e+01, 8.12531501e+00, 3.97113829e+00, 1.00777250e+01])
>>> print([ "{:0.2f}".format(x) for x in a ])
['21.53', '8.13', '3.97', '10.08']
 34
Author: rth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-07-19 12:33:52
[ round(x,2) for x in [2.15295647e+01, 8.12531501e+00, 3.97113829e+00, 1.00777250e+01]]
 0
Author: Roland,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-08 23:35:47