2017-09-18 6 views
2

Lorsque vous utilisez numpy.power(2,N), où N est un entier, je rencontre la question suivante:Python 3: RuntimeWarning avec numpy.power

In[1] np.power(2,63) 
Out[1] -9223372036854775808 
RuntimeWarning: invalid value encountered in power 

et encore plus étrange,

In[2] np.power(2,63)*2 
Out[2] 0 

Cela se produit pour tous exposants supérieur ou égal à 63. Je pensais que les grands nombres entiers ne sont pas un problème en Python - qu'est-ce qui ne va pas ici, alors?

+2

Vous n'avez pas ici affaire à des entiers Python, vous avez affaire à des entiers NumPy de taille fixe (64 bits dans ce cas), ce qui est une condition préalable pour les opérations mathématiques vectorisées rapides que fournit NumPy. Si vous voulez utiliser Python ints, écrivez '2 ** 63' ou' pow (2, 63) '. – jasonharper

Répondre

2

Les grands entiers ne sont pas un problème avec Python car Python n'a qu'un seul type d'entier et cela est d'une précision arbitraire. Mais NumPy uses normal "C" data types et ceux-ci ont une précision limitée:

>>> 2 ** 63    # Python 
9223372036854775808 

>>> np.int64(2) ** 63 # NumPy 
-9223372036854775808 

Sur la plupart des systèmes 64bit est le type entier de précision le plus élevé disponible avec NumPy simple. Donc, si vous avez affaire à des nombres plus grands, vous pouvez utiliser float dtypes ou simplement utiliser des entiers Python avec des listes normales ou des tableaux d'objets NumPy (pas vraiment recommandé).