Как установить точность на str (numpy.float64)? - PullRequest
13 голосов
/ 30 января 2011

Мне нужно написать пару пустых чисел в CSV-файл, который содержит дополнительное строковое содержимое. поэтому я не использую savetxt и т. д. с numpy.set_printoptions (), я могу определить только поведение печати, но не поведение str (). я знаю, что я что-то упускаю, и это не может быть так сложно, но я не могу найти разумный ответ на паутину. Может быть, кто-то может указать мне правильное направление. Вот пример кода:

In [1]: import numpy as np
In [2]: foo = np.array([1.22334])

In [3]: foo
Out[3]: array([ 1.22334])

In [4]: foo[0]
Out[4]: 1.2233400000000001

In [5]: str(foo[0])
Out[5]: '1.22334'

In [6]: np.set_printoptions(precision=3)

In [7]: foo
Out[7]: array([ 1.223])

In [8]: foo[0]
Out[8]: 1.2233400000000001

In [9]: str(foo[0])
Out[9]: '1.22334'

Как мне преобразовать np.float в красиво отформатированную строку, которую я могу передать в file.write ()?

С уважением,

fookatchu

Ответы [ 5 ]

10 голосов
/ 30 января 2011

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

>>> x = 1.2345678
>>> '%.2f' % x
'1.23'
9 голосов
/ 30 января 2011

Вы можете использовать обычное форматирование строки, см .: http://docs.python.org/library/string.html#formatspec

Пример:

print '{:.2f}'.format(0.1234)  # '0.12'
print '{:.2e}'.format(0.1234)  # '1.23e-01'
4 голосов
/ 27 апреля 2018

Numpy 1.14 и более поздние имеют функции format_float_positional и format_float_scientific для форматирования скаляра с плавающей запятой в виде десятичной строки в позиционной или научной нотации с контролем округления,обрезка и набивка.Эти функции обеспечивают гораздо больший контроль над форматированием, чем обычные формататоры строк Python.

import numpy as np

x = np.float64('1.2345678')
print(np.format_float_positional(x))  # 1.2345678
print(np.format_float_positional(x, precision=3))  # 1.235
print(np.format_float_positional(np.float16(x)))  # 1.234
print(np.format_float_positional(np.float16(x), unique=False, precision=8))  # 1.23437500

y = x / 1e8
print(np.format_float_scientific(y))  # 1.2345678e-08
print(np.format_float_scientific(y, precision=3, exp_digits=1))  # 1.235e-8

и т. Д.


Эти расширенные средства форматирования основаны на алгоритме Dragon4;см. Ryan Juckett's Печать чисел с плавающей точкой , чтобы узнать больше по теме.

3 голосов
/ 30 января 2011

Вместо str(foo[0]) используйте "%.3f" % foo[0].

0 голосов
/ 14 сентября 2015

Также вы можете сделать:

precision = 2
str(np.round(foo[0], precision))

У меня были некоторые преимущества перед ('% .2f'% x), когда мне нужно было сделать строку str (np.log (0.0)), которая аккуратно обрабатывается как "-inf" с помощью numpy, поэтому вы не должны не нужно беспокоиться здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...