2014-01-08 4 views
30

Если у меня есть Numpy массив так:Форматирование плавает в Numpy массиве

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

как я могу переместить десятичную точку и форматировать числа так, что я в конечном итоге с Numpy массива, как это:

[21.53, 8.13, 3.97, 10.08] 

np.around(a, decimals=2) только дает мне [2.15300000e+01, 8.13000000e+00, 3.97000000e+00, 1.00800000e+01] Который я не хочу, и я не нашел другого способа сделать это.

+0

Возможный дубликат [Как красиво печатать numpy.array без научной нотации и с заданной точностью?] (Http://stackoverflow.com/questions/2891790/how-to-pretty-printing-a-numpy- array-without-science-notation-and-with-given) –

ответ

43

Для того, чтобы сделать Numpy дисплея поплавка массивов в произвольном формате, можно определить пользовательскую функцию, которая принимает значение с плавающей запятой в качестве входных данных и возвращает отформатированную строку:

In [1]: float_formatter = lambda x: "%.2f" % x 

Здесь f здесь означает формат с фиксированной запятой (не «научный»), а .2 означает два десятичных знака (вы можете больше узнать о форматировании строк here).

Давайте проверить его со значением поплавка:

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

Чтобы сделать NumPy печать всех поплавковых массивов таким образом, вы можете передать formatter= аргумент np.set_printoptions:

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

Теперь NumPy напечатает все поплавковые массивы таким образом:

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

Примечание. что это влияет только на Numpy массивов, не скаляры:

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

Он также не будет затрагивать не-поплавки, сложные поплавки и т.д. - вам нужно будет определить отдельные форматтер для других скалярных типов.

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

Например:

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 печатает a, как если бы она была равна 0, но это не так - она ​​по-прежнему равна 1E-9.

Если вы действительно хотите округлить значения в массиве таким образом, чтобы это повлияло на то, как они будут использоваться в вычислениях, вы должны использовать np.round, как уже указывали другие.

0
[ round(x,2) for x in [2.15295647e+01, 8.12531501e+00, 3.97113829e+00, 1.00777250e+01]] 
13

Вы можете использовать круглую функцию. Вот несколько примеров

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

Если вы хотите изменить только отображать представление, я бы не рекомендуется изменить формат печати на глобальном уровне, как это было предложено выше. Я бы отформатировал вывод.

>>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'] 
+0

Следует отметить, что это выше, что изменяет представление, а не только значение отображения, как может сделать большинство пользователей. –

+0

@RamonMartinez вы правы. Я опубликовал это, потому что мне не нравилась идея изменить формат печати во всем мире, как это было предложено ранее. Позже в другой части программы вы можете получить 0.00 и создать новую тему в stackoverflow, почему это происходит. Поэтому в этом случае я просто использовал бы ["{: 0.2f}". Format (x) для x в a], где a - это массив numpy или любой другой итеративный объект (list, tuple ....). В этом случае вы не изменяете другие форматы печати. – rth

23

Вы вводите в заблуждение фактическую точность и точность отображения. Десятичное округление не может быть представлено точно в двоичном формате. Вы должны попробовать:

> np.set_printoptions(precision=2) 
> np.array([5.333333]) 
array([ 5.33]) 
+0

Эта проблема частично решена, я все еще получаю e + 01 (как в 2.15e + 01 вместо 21.5). – Kaly

+3

@kaly Hm, вы можете просто написать собственный форматтер ('np.set_printoptions (formatter = {float: float_formatting_function})'). – U2EF1

Смежные вопросы