как предотвратить автоматическое c смещение десятичных чисел в numpy - PullRequest
0 голосов
/ 12 марта 2020

Вот мой код:

y = np.array([-3.44 , 1.16 , -0.81])
y = np.exp(y)
print(y)

для этого блока, я получил следующий результат

[0.03206469 3.18993328 0.44485807]

Однако, когда я добавляю 3.91 в список, результат изменился

x = np.array([-3.44 , 1.16 , -0.81 , 3.91])
x = np.exp(x)
print(x)

результат:

[3.20646853e-02 3.18993328e+00 4.44858066e-01 4.98989520e+01]

как я могу предотвратить это изменение?

1 Ответ

2 голосов
/ 12 марта 2020

Вы можете использовать np.set_printoptions:

>>> x = np.array([-3.44 , 1.16 , -0.81 , 3.91])
>>> x = np.exp(x)
>>> print(x)
[3.20646853e-02 3.18993328e+00 4.44858066e-01 4.98989520e+01]

>>> np.set_printoptions(suppress=True, precision=8)

>>> print(x)
[ 0.03206469  3.18993328  0.44485807 49.89895197]

Объяснение:

Десятичное округление не всегда может быть точно представлено в двоичном виде, поэтому вы увидите некоторые несоответствия с плавающей точкой. Например:

>>> 0.1 + 0.2
0.30000000000000004

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

np.set_printoptions(suppress=True) подавляет нотацию scientifi c и подавляет плавающее по умолчанию указывает на 8 десятичных знаков, поэтому технически параметр precision в этом случае не требовался:

>>> np.set_printoptions(suppress=True)
>>> x
[ 0.03206469  3.18993328  0.44485807 49.89895197]

Я добавил precision на тот случай, если вы хотите добиться желаемой точности при печати. ​​

>>> np.set_printoptions(suppress=True, precision=2)
>>> x
array([ 0.03,  3.19,  0.44, 49.9 ])

Подробнее об операциях с плавающей запятой можно узнать здесь:

  1. Не работает ли математика с плавающей запятой?

  2. https://0.30000000000000004.com/

...