Подтвердить что ты не робот

Форматирование поплавков в массиве 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] Который я не хочу, и я не нашел другого способа сделать это.

4b9b3361

Ответ 1

Чтобы сделать float-массивы numpy display в произвольном формате, вы можете определить пользовательскую функцию, которая принимает значение float в качестве своего ввода и возвращает форматированную строку:

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

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

Позвольте проверить его с помощью значения float:

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, как уже указывали другие.

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

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