#numpy #math
#numpy #математика
Вопрос:
import numpy as np
import math
print -1/2*np.log2(1/2)-1/2*np.log2(1/2)
С принтами nan
Можете ли вы объяснить?
Комментарии:
1. Да:
RuntimeWarning: divide by zero encountered in log2. RuntimeWarning: invalid value encountered in double_scalars
2. Попробуйте заменить
1/2
на.5
:-.5*np.log2(.5)-.5*np.log2(.5)
->1.0
Ответ №1:
измените также версию python, первая — python 2.7, вторая — python 3.5
>>> import numpy as np
>>> print(-1/2*np.log2(1/2)-1/2*np.log2(1/2))
nan
>>> print(-1/2*np.log2(1/2)-1/2*np.log2(1/2))
1.0
Запрошена дополнительная информация…
>>> import numpy as np
>>> print(-1/2*np.log2(1/2)-1/2*np.log2(1/2))
__main__:1: RuntimeWarning: divide by zero encountered in log2
__main__:1: RuntimeWarning: invalid value encountered in double_scalars
nan
Теперь этого можно избежать, изменив ваши условия… самый простой способ — сделать это напрямую…
>>> import numpy as np
>>> print(-1/2.*np.log2(1/2.)-1/2.*np.log2(1/2.))
1.0
Та же версия numpy, только python изменился с 2.7 на 3.5
Комментарии:
1. Без дополнительной информации, добавленной к этому ответу, это бесполезно.
Ответ №2:
В python 2.x деление между целыми числами является евклидовым делением, поэтому 1/2 равно 0, а np.log(0) возвращает nan.
Использование python 3:
Python 3.5.2 |Anaconda 4.2.0 (64-bit)| (default, Jul 2 2016, 17:53:06)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-1)] on linux
>>> 1/2
0.5
тогда как в python 2:
Python 2.7.12 |Continuum Analytics, Inc.| (default, Jul 2 2016, 17:42:40)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-1)] on linux2
>>> 1/2
0
>>> 1./2
0.5
>>> from __future__ import division
>>> 1/2
0.5
Я включил два способа получить обычное деление в python 2: использование float (1. вместо 1) или импорт деления из __future __