Что не так с numpy? Я не вижу результата

#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 __