Formatowanie w tablicy numpy [duplikat]
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ć.
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.
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])
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']
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]]
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