2017-09-18 5 views
2

Wenn numpy.power(2,N) verwenden, wo N eine ganze Zahl ist, ich das folgende Problem auftreten:Python 3: RuntimeWarning mit numpy.power

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

und noch mehr seltsam,

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

Dieses ist für alle geschieht Exponenten größer als oder gleich 63. Ich dachte, dass große Integer in Python kein Problem sind - was ist dann hier falsch?

+2

Sie haben es hier nicht mit Python-Ganzzahlen zu tun, Sie beschäftigen sich mit NumPy-Ganzzahlen, die eine feste Größe haben (64 Bits in diesem Fall), was eine Voraussetzung für die schnellen vektorisierten mathematischen Operationen von NumPy ist. Wenn Sie Python-Ints verwenden wollen, schreiben Sie '2 ** 63' oder' pow (2, 63) '. – jasonharper

Antwort

2

Große ganze Zahlen sind kein Problem mit Python, weil Python nur einen Integer-Typ hat und von beliebiger Genauigkeit ist. Aber NumPy uses normal "C" data types und diese haben eine begrenzte Genauigkeit:

>>> 2 ** 63    # Python 
9223372036854775808 

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

Auf den meisten Systemen 64-Bit ist die höchste Präzision Integer-Typ erhältlich mit glatter NumPy. Also, wenn Sie mit größeren Zahlen zu tun haben, könnten Sie float dtypes verwenden oder einfach Python-Integer mit normalen Listen oder NumPy-Objekt-Arrays verwenden (nicht wirklich empfohlen).